当前位置:  开发笔记 > 运维 > 正文

如何在文件中搜索多行模式?

如何解决《如何在文件中搜索多行模式?》经验,为你挑选了6个好方法。

我需要找到包含特定字符串模式的所有文件.想到的第一个解决方案是使用带有xargs grep的find管道:

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

但是如果我需要找到跨越多行的模式,我就会被卡住,因为vanilla grep找不到多行模式.



1> Oli..:

所以我发现pcregrep代表Perl兼容的正则表达式GREP.

例如,您需要查找" _name "变量后面紧跟" _description "变量的文件:

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

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


正如下面的halka所提到的,"如果你将(?s)添加到正则表达式中,你也可以说服点通配符匹配换行符".然后通过添加-P将grep与perl正则表达式一起使用.找 .-exec grep -nHP'(?s)SELECT.{1,60} FROM.{1,20} table_name''{}'\;
`pcregrep`可以在mac上使用`brew install pcre`

2> 小智..:

你为什么不去找awk:

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


太好了!有没有办法使这场比赛不贪婪?
你怎么只在匹配时打印文件名?
这很容易理解,并使用大多数* nix系统随附的`awk`。
你可以用'awk'/ Start pattern /,/ End pattern/{printf NR""来显示匹配的行号.print}'filename`.你可以通过给行号固定宽度来使它更漂亮:`awk'/ Start pattern /,/ End pattern/{printf"%-4s",NR; print}'filename`.

3> ayaz..:

以下是使用GNUgrep的示例:

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

-z/ --null-data将输入和输出数据视为行序列.

另见这里


对于非ASCII文件,我建议''**grep -Pazo**''而不是''-Pzo''.这是更好的,因为-z开关非ASCII文件**可能会触发grep的"二进制数据"行为,这会改变返回值.切换'' - a | --text''阻止了.

4> bukzor..:

grep -P还采用libpcre,但很多更广泛安装.要查找titlehtml文档的完整部分,即使它跨越多行,您也可以使用:

grep -P '(?s).*' example.html

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

http://perldoc.perl.org/perlre.html#Modifiers

http://perldoc.perl.org/perlre.html#Extended-Patterns



5> Oli..:

这是一个更有用的例子:

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

它在html文件中搜索title标签,即使它最多可以跨越5行.

以下是无限行的示例:

pcregrep -Mi "(?s).*" example.html 


@matt:如果你在你的正则表达式中添加`(?s)`,你也可以说服点通配符匹配换行符:`"(?s).*"`
谢谢你.我没有意识到通配符与换行符不匹配.

6> Shwaydogg..:

随着银搜索:

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

银色搜索者的速度优化可能会在这里发挥作用.

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有