如何在文件中搜索多行模式?

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

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

但是如果我需要找到跨越不止一行的模式,那么我就卡住了,因为香草 grep 无法找到多行模式。

151365 次浏览

所以我发现 Pcregrep代表 兼容正则表达式

M 选项使得搜索跨行边界的模式成为可能。

例如,您需要查找下一行中‘ _ name’变量后面跟着‘ _ 描述’变量的文件:

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

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

下面是使用 GNU grep的例子:

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

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

其效果是将整个文件视为一个大行。 请参阅 -z描述 在 Grep 手册上和 grep 手册使用页面上的常见问题14

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

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

它搜索 html 文件中的 title 标记,即使它最多跨越5行。

下面是一个无限行的例子:

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

你为什么不选 :

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

这个答案可能有用:

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

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

使用 grep ——  排除/—— include 的語法來避免在某些文件中使用 grep

grep -P也使用 libpcre,但是 很多的安装范围更广。要查找 html 文档的完整 title部分,即使它跨越多行,也可以使用以下方法:

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

因为 PCRE 项目实现了 perl 标准,所以使用 perl 文档作为参考:

银色搜索器:

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

白银搜索器的速度优化可能会在这里大放异彩。

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

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

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

(search all *.py files for the specified multiline regex pattern)

It is available for all major operating systems. Take a look at the samples page to see how it can be used to to extract multiline values from an XML file.

@ Marcin: 不贪婪的例子:

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

使用 ex/vi编辑器和 全球之星选项(语法类似于 awksed) :

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

其中 aaa是起点,bbb是结束文本。

若要递归搜索,请尝试:

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

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

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