如何在文件中search多行模式?

我需要find所有包含特定string模式的文件。 首先想到的解决scheme是使用xargs greppipe道查找

find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN' 

但是,如果我需要find跨越多行的模式,我会卡住,因为香草grep找不到多行模式。

所以我发现了Perl Compatible Regular Expressions GREP的pcregrep

例如,你需要find' _name 'variables紧接着' _description 'variables的文件:

 find . -iname '*.py' | xargs pcregrep -M '_name.*\n.*_description' 

提示:您需要在您的模式中包含换行符。 根据你的平台,它可能是'\ n',\ r','\ r \ n',…

你为什么不去awk :

 awk '/Start pattern/,/End pattern/' filename 

有什么特别的原因吗?

 grep -Pzo '_name.*\n.*_description' 

会不会达到相同的结果?

(编辑:这个post的前一个版本只使用“-P”,但这仍然只能在一行)

grep -P也使用libpcre,但安装广泛得多 。 要find一个html文档的完整title部分,即使它跨越多行,你可以使用这个:

 grep -P '(?s)<title>.*</title>' example.html 

由于PCRE项目实现了perl标准,因此请使用perl文档进行参考:

这是一个更有用的例子:

 pcregrep -Mi "<title>(.*\n){0,5}</title>" afile.html 

它在HTML文件中search标题标签,即使它跨越多行。

与银search者 :

 ag 'abc.*(\n|.)*efg' 

silverlightsearch者的速度优化可能会在这里闪耀。

这个答案可能是有用的:

正则expression式(grep)需要多行search

要recursion地查找,可以使用标志-R(recursion)和–include(GLOB模式)。 看到:

使用grep –exclude / – include语法不通过某些文件grep

您可以在这里使用grep替代筛选 (免责声明:我是作者)。

它支持多行匹配,并将search范围限制在特定的文件types之外:

 筛选-m  - 文件'* .py''YOUR_PATTERN' 

(search指定的多行正则expression式模式的所有* .py文件)

它适用于所有主要操作系统。 查看示例页面 ,了解如何使用它从XML文件中提取多行值。

使用ex / vi编辑器和globstar (类似于awksed语法):

 ex +"/aaa/,/bbb/p" -scq! **/*.py 

aaa是你的起点, bbb是你的结局文本。

 perl -ne 'print if (/begin pattern/../end pattern/)' filename 

@Marcin:awk例子非贪心:

 awk '{if ($0 ~ /Start pattern/) {triggered=1;}if (triggered) {print; if ($0 ~ /End pattern/) { exit;}}}' filename