146

我需要找到所有包含特定字符串模式的文件。想到的第一个解决方案是使用带有xargs grep的find管道:

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

但是,如果我需要找到跨越多行的模式,我会被卡住,因为 vanilla grep 无法找到多行模式。

4

11 回答 11

113

你为什么不去awk

awk '/Start pattern/,/End pattern/' filename
于 2010-09-15T13:26:46.553 回答
107

所以我发现了pcregrep,它代表Perl Compatible Regular Expressions GREP

-M 选项可以搜索跨越行边界的模式。

例如,您需要查找“ _name ”变量在下一行后面跟着“ _description ”变量的文件:

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

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

于 2008-09-30T11:54:44.207 回答
105

这是使用GNUgrep的示例:

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

-z/--null-data将输入视为一组行,每行都以零字节(ASCII NUL 字符)而不是换行符结尾。

这具有将整个文件视为一大行的效果。请参阅此处的说明

于 2008-09-30T12:07:43.270 回答
24

grep -P也使用 libpcre,但安装范围更广。要查找titlehtml 文档的完整部分,即使它跨越多行,您也可以使用以下命令:

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

由于PCRE 项目实现了 perl 标准,请使用 perl 文档作为参考:

于 2012-07-26T18:47:20.663 回答
21

这是一个更有用的例子:

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

它会在 html 文件中搜索标题标签,即使它跨越多达 5 行。

这是无限行的示例:

pcregrep -Mi "(?s)<title>.*</title>" example.html 
于 2008-09-30T12:36:49.457 回答
11

银搜索器

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

Silver Searcher 的速度优化可能会在这里大放异彩。

于 2015-01-13T21:05:33.803 回答
4

您可以在此处使用 grep 替代筛选(免责声明:我是作者)。

它支持多行匹配并将搜索限制为开箱即用的特定文件类型:

筛选 -m --files '*.py' 'YOUR_PATTERN'

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

它适用于所有主要操作系统。查看示例页面,了解如何使用它从 XML 文件中提取多行值。

于 2015-02-22T22:50:03.237 回答
3

这个答案可能有用:

需要用于多行搜索的正则表达式(grep)

要递归查找,您可以使用标志 -R(递归)和 --include(GLOB 模式)。看:

使用 grep --exclude/--include 语法不通过某些文件 grep

于 2011-08-24T03:19:57.020 回答
3

@Marcin:非贪婪的 awk 示例:

awk '{if ($0 ~ /Start pattern/) {triggered=1;}if (triggered) {print; if ($0 ~ /End pattern/) { exit;}}}' filename
于 2015-07-23T13:53:13.940 回答
3
perl -ne 'print if (/begin pattern/../end pattern/)' filename
于 2016-04-04T00:51:19.387 回答
2

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

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

哪里aaa是你的起点,bbb是你的结束文本。

要递归搜索,请尝试:

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

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

于 2015-10-16T23:11:30.097 回答