我需要找到所有包含特定字符串模式的文件。 浮现在脑海的第一个解决方案是使用查找管道与xargs的grep的 :
find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'
但是,如果我需要找到一个以上的线跨越图案,我坚持因为香草的grep找不到多行模式。
我需要找到所有包含特定字符串模式的文件。 浮现在脑海的第一个解决方案是使用查找管道与xargs的grep的 :
find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'
但是,如果我需要找到一个以上的线跨越图案,我坚持因为香草的grep找不到多行模式。
所以我发现pcregrep它代表Perl兼容正则表达式GREP。
例如,你需要找到的“_name”变量immediatelly其次是“_description”变量文件:
find . -iname '*.py' | xargs pcregrep -M '_name.*\n.*_description'
提示:您需要在您的模式换行字符。 根据您的平台,它可能是 '\ n',\ r”, '\ r \ n',...
你为什么不出去AWK :
awk '/Start pattern/,/End pattern/' filename
下面是使用例如GNU grep
:
grep -Pzo '_name.*\n.*_description'
-z
/--null-data
对待输入和输出数据为线条的序列。
另请参见这里
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
随着银搜索 :
ag 'abc.*(\n|.)*efg'
银搜索的速度优化可能会照耀在这里。
您可以使用grep替代筛这里(免责声明:我是作者)。
它支持多匹配和限制搜索特定的文件类型现成的:
sift -m --files '*.py' 'YOUR_PATTERN'
(搜索所有* .py文件指定的多正则表达式)
它适用于所有主要的操作系统。 看看在样本页面 ,看看它是如何被用于从XML文件中提取多值。
这个答案可能是有用的:
正则表达式(grep的)多线搜索需要
为了找到递归可以使用标志-R(递归)和--include(GLOB模式)。 看到:
使用grep --exclude / -包括语法不通过某些文件的grep
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
(击4的zsh)。
@Marcin:AWK例如非贪婪:
awk '{if ($0 ~ /Start pattern/) {triggered=1;}if (triggered) {print; if ($0 ~ /End pattern/) { exit;}}}' filename