如何在文件中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 (类似于awk
和sed
语法):
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