![多行正则表达式空行分隔符,](https://linux22.com/image/53897/%E5%A4%9A%E8%A1%8C%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%A9%BA%E8%A1%8C%E5%88%86%E9%9A%94%E7%AC%A6%EF%BC%8C.png)
我有一个程序可以按块打印数据。每个块都由空行分隔。
我想丢弃大多数块,只保留那些包含与正则表达式匹配的块。
我当然可以使用脚本语言或程序来完成它,但这看起来相当粗糙。有更好的方法吗?
答案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