次のファイルがあります。
------
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
-
a
a
a
a
以下は、より理解しやすい方法で作成されたものと同じです。
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
注:これは例ではうまく機能しますが、-
テキストのどこかに発生すると問題が発生する可能性があります。しかし、これについて詳しく説明できるようです。