我需要找到包含特定字符串模式的所有文件.想到的第一个解决方案是使用带有xargs grep的find管道:
find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'
但是如果我需要找到跨越多行的模式,我就会被卡住,因为vanilla grep找不到多行模式.
所以我发现pcregrep代表Perl兼容的正则表达式GREP.
例如,您需要查找" _name "变量后面紧跟" _description "变量的文件:
find . -iname '*.py' | xargs pcregrep -M '_name.*\n.*_description'
提示:您需要在模式中包含换行符.根据您的平台,它可能是'\n',\ r','\ r \n',...
你为什么不去找awk:
awk '/Start pattern/,/End pattern/' filename
以下是使用GNUgrep
的示例:
grep -Pzo '_name.*\n.*_description'
-z
/--null-data
将输入和输出数据视为行序列.
另见这里
grep -P
还采用libpcre,但很多更广泛安装.要查找title
html文档的完整部分,即使它跨越多行,您也可以使用:
grep -P '(?s).* ' example.html
由于PCRE项目实现了perl标准,因此请使用perl文档作为参考:
http://perldoc.perl.org/perlre.html#Modifiers
http://perldoc.perl.org/perlre.html#Extended-Patterns
这是一个更有用的例子:
pcregrep -Mi "(.*\n){0,5} " afile.html
它在html文件中搜索title标签,即使它最多可以跨越5行.
以下是无限行的示例:
pcregrep -Mi "(?s).* " example.html
随着银搜索:
ag 'abc.*(\n|.)*efg'
银色搜索者的速度优化可能会在这里发挥作用.