複数行正規表現の空行区切り記号、

複数行正規表現の空行区切り記号、

データを塊に印刷するプログラムがあります。各ブロックは空行で区切られます。

ほとんどのブロックを捨てて正規表現に一致するブロックだけを維持したいと思います。

もちろん、スクリプト言語やプログラムを使用してこれを行うこともできますが、これはかなり粗雑に見えます。もっと良い方法がありますか?

答え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

関連情報