多行正则表达式空行分隔符,

多行正则表达式空行分隔符,

我有一个程序可以按块打印数据。每个块都由空行分隔。

我想丢弃大多数块,只保留那些包含与正则表达式匹配的块。

我当然可以使用脚本语言或程序来完成它,但这看起来相当粗糙。有更好的方法吗?

答案1

awkperl有专门为此设计的特殊模式。叫做段落模式。在该模式下,记录是段落,即它们由空行序列分隔。

对于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

相关内容