我如何可以搜索文件中的多模式?(How can I search for a multiline p

2019-07-21 03:28发布

我需要找到所有包含特定字符串模式的文件。 浮现在脑海的第一个解决方案是使用查找管道与xargs的grep的

find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'

但是,如果我需要找到一个以上的线跨越图案,我坚持因为香草的grep找不到多行模式。

Answer 1:

所以我发现pcregrep它代表Perl兼容正则表达式GREP。

例如,你需要找到的“_name”变量immediatelly其次是“_description”变量文件:

find . -iname '*.py' | xargs pcregrep -M '_name.*\n.*_description'

提示:您需要在您的模式换行字符。 根据您的平台,它可能是 '\ n',\ r”, '\ r \ n',...



Answer 2:

你为什么不出去AWK :

awk '/Start pattern/,/End pattern/' filename


Answer 3:

下面是使用例如GNU grep

grep -Pzo '_name.*\n.*_description'

-z / --null-data对待输入和输出数据为线条的序列。

另请参见这里



Answer 4:

grep -P也使用libpcre,但广泛的安装。 为了找到一个完整的title HTML文档的部分,即使它跨越多行,您可以使用此:

grep -P '(?s)<title>.*</title>' example.html

由于该项目PCRE实现对Perl标准,借鉴了Perl文档:

  • http://perldoc.perl.org/perlre.html#Modifiers
  • http://perldoc.perl.org/perlre.html#Extended-Patterns


Answer 5:

下面是一个更有用的例子:

pcregrep -Mi "<title>(.*\n){0,5}</title>" afile.html

它搜索哪怕跨度达5线在HTML文件的标题标签。

下面是无限线的一例:

pcregrep -Mi "(?s)<title>.*</title>" example.html 


Answer 6:

随着银搜索 :

ag 'abc.*(\n|.)*efg'

银搜索的速度优化可能会照耀在这里。



Answer 7:

您可以使用grep替代筛这里(免责声明:我是作者)。

它支持多匹配和限制搜索特定的文件类型现成的:

sift -m --files '*.py' 'YOUR_PATTERN'

(搜索所有* .py文件指定的多正则表达式)

它适用于所有主要的操作系统。 看看在样本页面 ,看看它是如何被用于从XML文件中提取多值。



Answer 8:

这个答案可能是有用的:

正则表达式(grep的)多线搜索需要

为了找到递归可以使用标志-R(递归)和--include(GLOB模式)。 看到:

使用grep --exclude / -包括语法不通过某些文件的grep



Answer 9:

perl -ne 'print if (/begin pattern/../end pattern/)' filename


Answer 10:

使用ex / vi编辑和globstar选项 (语法类似于awksed ):

ex +"/string1/,/string3/p" -R -scq! file.txt

其中, aaa是你的起点, bbb是你的结局文本。

递归搜索,尝试:

ex +"/aaa/,/bbb/p" -scq! **/*.py

注意:要启用**语法,运行shopt -s globstar (击4的zsh)。



Answer 11:

@Marcin:AWK例如非贪婪:

awk '{if ($0 ~ /Start pattern/) {triggered=1;}if (triggered) {print; if ($0 ~ /End pattern/) { exit;}}}' filename


文章来源: How can I search for a multiline pattern in a file?