我需要找到的所有文件中所包含的一个具体串的模式。第一个解决方案,想到的是使用 找到 管用 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

以下是使用 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

它会搜索html文件中的标题标记,即使它最多可以分为5行。

以下是无限行的示例:

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 / - 包括不浏览某些文件的语法

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top