Oli*_*Oli 113 linux command-line grep find pcregrep
我需要找到包含特定字符串模式的所有文件.想到的第一个解决方案是使用带有xargs grep的find管道:
find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'
Run Code Online (Sandbox Code Playgroud)
但是如果我需要找到跨越多行的模式,我就会被卡住,因为vanilla grep找不到多行模式.
Oli*_*Oli 93
所以我发现pcregrep代表Perl兼容的正则表达式GREP.
例如,您需要查找" _name "变量后面紧跟" _description "变量的文件:
find . -iname '*.py' | xargs pcregrep -M '_name.*\n.*_description'
Run Code Online (Sandbox Code Playgroud)
提示:您需要在模式中包含换行符.根据您的平台,它可能是'\n',\ r','\ r \n',...
小智 87
你为什么不去找awk:
awk '/Start pattern/,/End pattern/' filename
Run Code Online (Sandbox Code Playgroud)
aya*_*yaz 71
以下是使用GNUgrep的示例:
grep -Pzo '_name.*\n.*_description'
Run Code Online (Sandbox Code Playgroud)
-z/--null-data将输入和输出数据视为行序列.
另见这里
buk*_*zor 21
grep -P还采用libpcre,但很多更广泛安装.要查找titlehtml文档的完整部分,即使它跨越多行,您也可以使用:
grep -P '(?s)<title>.*</title>' example.html
Run Code Online (Sandbox Code Playgroud)
由于PCRE项目实现了perl标准,因此请使用perl文档作为参考:
Oli*_*Oli 15
这是一个更有用的例子:
pcregrep -Mi "<title>(.*\n){0,5}</title>" afile.html
Run Code Online (Sandbox Code Playgroud)
它在html文件中搜索title标签,即使它最多可以跨越5行.
以下是无限行的示例:
pcregrep -Mi "(?s)<title>.*</title>" example.html
Run Code Online (Sandbox Code Playgroud)
这个答案可能有用:
要递归查找,您可以使用标志 -R (递归)和 --include (GLOB 模式)。看:
使用 grep --exclude/--include 语法不通过某些文件进行 grep
小智 5
@Marcin:awk 非贪婪示例:
awk '{if ($0 ~ /Start pattern/) {triggered=1;}if (triggered) {print; if ($0 ~ /End pattern/) { exit;}}}' filename
Run Code Online (Sandbox Code Playgroud)