sedを使用して一致するパターンの下の行ブロックを印刷する方法

sedを使用して一致するパターンの下の行ブロックを印刷する方法

最初の行をラベルとして定期的に新しいテキストブロックを追加するログファイルがあります。すべてのタグは+で始まります。ブロックには終了モードはありません。各ブロックは、1行でも複数行でも構いません。

+numbers
23
-87
12
+letters
b
w
a
q
+sentences
line of text
another line of text
+numbers
2
34
+address
line1
line2
line3
+numbers
4
87

与えられたタグで始まるすべてのブロックを印刷したいです。たとえば、+数字について見たいものは次のとおりです。

+numbers
23
-87
12
+numbers
2
34
+numbers
4
87

または+アドレスの場合:

+address
line1
line2
line3

awkを使用してこれを行うことができます。しかし、私はsedソリューションを探しています。

ベストアンサー1

次のいずれかを使用してこれを実行できますsed(空白行、連続ブロックなど、すべての入力に対して機能する必要があります+numbers)。

sed -e '/^+/!{H;$!d;}' -e 'x;/^+numbers/!d' logfile

仕組み:

sed '/^+/!{         # if a line doesn't start with a + (so, not a tag)
H                   # append it to hold space and then,
$!d                 # if it's not the last line, delete it (that is, get a
}                   # new input line and restart the cycle); 
x                   # otherwise, exchange buffers and 
/^+numbers/!d'      # if the pattern space doesn't match "^+numbers", delete it
logfile

つまり、「表示された」行は実行時に保持バッファに格納され、ブロックの残りの行xは実行時に追加されます。H次の「表示された」行がパターン空間(または最後の行)に入ると、バッファは再び置き換えられるため、パターン空間には完全な行ブロックが含まれるようになりました。次に始めるのは自動印刷の問題です。+numbers

おすすめ記事