我需要找到所有包含特定字符串模式的文件。我想到的第一个解决方案是使用通过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无法找到多线模式。
Answers:
因此,我发现pcregrep代表Perl兼容正则表达式GREP。
例如,您需要找到文件中_name变量后紧跟_description变量的文件:
find . -iname '*.py' | xargs pcregrep -M '_name.*\n.*_description'
提示:您需要在模式中包括换行符。根据您的平台,它可能是'\ n',\ r','\ r \ n',...
pcregrep
可在Mac上使用brew install pcre
-H
哪一个在每次匹配之前打印文件名:pcregrep -HM
。
你为什么不去awk:
awk '/Start pattern/,/End pattern/' filename
awk
大多数* nix系统随附的更容易理解和使用的方法。
awk '/Start pattern/,/End pattern/ {printf NR " "; print}' filename
。您可以通过将行号设置为固定宽度来使其更漂亮awk '/Start pattern/,/End pattern/ {printf "%-4s ", NR; print}' filename
。
-z
因此它不会在单行上拆分搜索,并且-o
仅打印匹配的部分。
grep -rzl pattern *
,-rzo无效)
brew reinstall --with-pcre git
grep -P
还采用libpcre,但很多更广泛安装。要查找title
html文档的完整部分,即使它跨越多行,也可以使用以下命令:
grep -P '(?s)<title>.*</title>' example.html
由于PCRE项目实现了perl标准,因此请使用perl文档作为参考:
这是一个更有用的示例:
pcregrep -Mi "<title>(.*\n){0,5}</title>" afile.html
即使它跨越多达5行,它也会在html文件中搜索标题标签。
这是无限行的示例:
pcregrep -Mi "(?s)<title>.*</title>" example.html
(?s)
正则表达式,也可以说服点通配符匹配换行符,如下所示:"(?s)<html>.*</html>"
$
(在模式的末尾)以表示它是该行的末尾-尽管这与帮助您找到多个线型不同。另请参阅glob(7)
。:您也可能会发现这个网站的兴趣regular-expressions.info
这个答案可能有用:
要进行递归查找,可以使用标志-R(递归)和--include(GLOB模式)。看到:
使用ex
/ vi
编辑器和globstar选项(类似于awk
和的语法sed
):
ex +"/string1/,/string3/p" -R -scq! file.txt
aaa
起点是哪里,bbb
终点是哪里。
要进行递归搜索,请尝试:
ex +"/aaa/,/bbb/p" -scq! **/*.py
注意:要启用**
语法,请运行shopt -s globstar
(Bash 4或zsh)。