GNU sedを使用して空行で区切ることができる2つのパターン行間のヘッダー名の抽出

GNU sedを使用して空行で区切ることができる2つのパターン行間のヘッダー名の抽出

次のファイルがあります。

------

Introduction
----------
Optio eum enim ut. Et quia molestias eos. Doloribus laborum quia quae. Magnam cupiditate quis consectetur.

-----
Chapter1: Foo
-----

Odit beatae eius voluptas temporibus sint quia. Eos et tempora similique laboriosam optio consequatur quibusdam. Fugit suscipit cupiditate ea perspiciatis rem labore cum eos.

-----
Chapter bar


-----
Et consequatur quia quia et architecto et sunt. Perferendis qui deserunt qui est illo est sapiente ipsam. Fugiat vel amet magni in quam. Eligendi totam cum sapiente harum blanditiis minima

次の制約があります。

  • タイトル記号は-少なくとも5文字でなければなりません。
  • -ヘッダーとヘッダーの間には、必要な数の空白行があるかもしれません(しかし制限されています)。

予想される出力は次のとおりです。

Introduction
Chapter1: Foo
Chapter bar

を使用してこれを行うことができることを知っていますが、awk提案しないでください。私は純粋なGNU sedソリューションを見たいです。

これまでに試したことは次のとおりです。

sed -n ':a; /-\+/{n; /^$/!{p; b a}}' input.txt

しかし、コマンドが機能していないようです。

答え1

これにより、ヘッダー内にある1つ以上の英字または数字を含む行が印刷されます。

sed -n '/^-----/,/^-----/{/[[:alnum:]]/p;}' file

答え2

私はこの解決策を提案します:

$ sed -n '/\-\{5,\}/,/\-\{5,\}/p' file | sed '/\-\+\|^$/d'
Introduction
Chapter1: Foo
Chapter bar

  • '/\-\{5,\}/,/\-\{5,\}/p'セクションから選択します-(少なくとも5つ)。
  • '/\-\+\|^$/d'空白行を削除するか、で終了します-

答え3

sed実際には他のツールでもこれを行うことができますが、物事が簡単になります(IMO)1も動作します。たとえば、次のようになりますawk

$ awk '/-----/ && !a{a=1;next} /-----/ && a{a=0}a' file 

Introduction
Chapter1: Foo
Chapter bar


空行を削除するには:

$ grep . file | awk '/-----/ && !a{a=1;next} /-----/ && a{a=0}a'
Introduction
Chapter1: Foo
Chapter bar

または:

$ awk '!/./{next};/-----/ && !a{a=1;next} /-----/ && a{a=0}a' file 
Introduction
Chapter1: Foo
Chapter bar

ここでのアイデアは、変数が現在0または設定されていない場合(a)現在の行が5以上に一致する場合は変数を設定することです。 1に設定されている場合は、5を含む他の行が見つかった場合は再びに設定されます。次に、設定されているすべての行を印刷します(これはfinalが実行するものです。ゼロ以外であると評価されると印刷されます)。1!a-0-aaaa

以下は、より理解しやすい方法で作成されたものと同じです。

awk '{ 
        if(!/./){ next } 
        if(/-----/ && !a){ a=1; next} 
        if(/-----/ && a){ a=0 } 
        if(a){ print }
    }' file

1クワジモドの答えはるかに簡単です!

答え4

あなたはそれを使用することができます:

sed -n '/^-\+$/,/^-\+$/{/^-*$/!p}' input.txt

または、次のものを使用できますsed -z

sed -Ez 's/[^-]*-+[\n]*([^\n]*\n)[\n]*-+[^-]*/\1/g' input.txt

いいえ-E:

sed -z 's/[^-]*-\+[\n]*\([^\n]*\n\)[\n]*-\+[^-]*/\1/g' input.txt

注:これは例ではうまく機能しますが、-テキストのどこかに発生すると問題が発生する可能性があります。しかし、これについて詳しく説明できるようです。

関連情報