データを塊に印刷するプログラムがあります。各ブロックは空行で区切られます。
ほとんどのブロックを捨てて正規表現に一致するブロックだけを維持したいと思います。
もちろん、スクリプト言語やプログラムを使用してこれを行うこともできますが、これはかなり粗雑に見えます。もっと良い方法がありますか?
答え1
awk
そして、perl
このために設計された特殊モードもあります。 ~と呼ばれる節モデル。このモードでは、レコードは段落です。つまり、一連の空行に分けられます。
の場合は空の文字列にawk
設定されます。RS
awk -v RS= -v ORS='\n\n' '/regexp/'
そしてperl
、そしてです-00
。
perl -00 -ne 'print if /regexp/'
答え2
これは通常awk
設定で行うことができます。記録区切り記号二重改行文字に変換し、レコードで正規表現の一致を実行します。たとえば、私が持っている場合
block #1
this block doesnt' contain
anything I want to keep
here's a block
with some important stuff
here's another
block of stuff
and another
それから
$ awk -vRS="\n\n" '/important/ {print}' blocktext.txt
here's a block
with some important stuff
たとえば、明確に答えるのは簡単です。
答え3
走るpcregrep@steeldriverの例では、複数行モードで次のことを行います。
pcregrep -Mo '\n\n\K(.|\n)*?important(.|\n)*?(?=\n\n)' file
here's a block
with some important stuff