我需要找到所有包含特定字符串模式的文件。想到的第一个解决方案是使用带有xargs grep的find管道:
find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'
但是,如果我需要找到跨越多行的模式,我会被卡住,因为 vanilla grep 无法找到多行模式。
我需要找到所有包含特定字符串模式的文件。想到的第一个解决方案是使用带有xargs grep的find管道:
find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'
但是,如果我需要找到跨越多行的模式,我会被卡住,因为 vanilla grep 无法找到多行模式。
你为什么不去awk:
awk '/Start pattern/,/End pattern/' filename
所以我发现了pcregrep,它代表Perl Compatible Regular Expressions GREP。
-M 选项可以搜索跨越行边界的模式。
例如,您需要查找“ _name ”变量在下一行后面跟着“ _description ”变量的文件:
find . -iname '*.py' | xargs pcregrep -M '_name.*\n.*_description'
提示:您需要在模式中包含换行符。根据您的平台,它可能是 '\n'、\r'、'\r\n'、...
grep -P
也使用 libpcre,但安装范围更广。要查找title
html 文档的完整部分,即使它跨越多行,您也可以使用以下命令:
grep -P '(?s)<title>.*</title>' example.html
由于PCRE 项目实现了 perl 标准,请使用 perl 文档作为参考:
这是一个更有用的例子:
pcregrep -Mi "<title>(.*\n){0,5}</title>" afile.html
它会在 html 文件中搜索标题标签,即使它跨越多达 5 行。
这是无限行的示例:
pcregrep -Mi "(?s)<title>.*</title>" example.html
这个答案可能有用:
要递归查找,您可以使用标志 -R(递归)和 --include(GLOB 模式)。看:
@Marcin:非贪婪的 awk 示例:
awk '{if ($0 ~ /Start pattern/) {triggered=1;}if (triggered) {print; if ($0 ~ /End pattern/) { exit;}}}' filename
perl -ne 'print if (/begin pattern/../end pattern/)' filename
使用ex
/vi
编辑器和globstar 选项(语法类似于awk
and sed
):
ex +"/string1/,/string3/p" -R -scq! file.txt
哪里aaa
是你的起点,bbb
是你的结束文本。
要递归搜索,请尝试:
ex +"/aaa/,/bbb/p" -scq! **/*.py
注意:要启用**
语法,请运行shopt -s globstar
(Bash 4 或 zsh)。