我怎么可以搜索的多行模式中的一个文件?
-
02-07-2019 - |
题
我需要找到的所有文件中所包含的一个具体串的模式。第一个解决方案,想到的是使用 找到 管用 xargs查询:
find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'
但是,如果我需要找到模式,跨越了在一个多行,我坚持,因为香草的查询无法找到多行模式。
解决方案
所以我发现 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
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模式)。参见:
perl -ne 'print if (/begin pattern/../end pattern/)' filename
使用 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)。
@Marcin: awk示例非贪婪:
awk '{if (<*> ~ /Start pattern/) {triggered=1;}if (triggered) {print; if (<*> ~ /End pattern/) { exit;}}}' filename
不隶属于 StackOverflow