括号内的多行组捕获

括号内的多行组捕获

我在文件中有类似这样的内容testtt

{It captures this! }
// question: 2572410  name: Question 2

::Question 2::[html] Is it going to be -40 tomorrow?

{
It can't
capture this!!! why?
}

当我做:

grep -o '{\([^}]*\)}' testttt

它无法捕获多行括号。如能提供任何帮助来修改它,使其能够捕获两者,我将不胜感激!

PS. 我还测试了以下给出的解决方案:如何在多行上 grep 多个模式? 并出现以下错误:

grep: unescaped ^ or $ not supported with -Pz

您可以找到输出的文本文件和文件内容这里

答案1

默认情况下,grep读取并处理单行。

在较新版本的 中grep,您可以使用-z选项告诉它将其输入视为以空字符分隔而不是以换行符分隔;由于您的输入没有空字符终止符,因此这基本上相当于 perl 的“slurp”模式。因此您可以这样做

$ grep -zPo '{[^}]*}' testttt
{It captures this! }
{
It can't
capture this!!! why?
}

或者,更危险的是,使用.*?非贪婪匹配来(?s)包含换行符.

$ grep -zPo '(?s){.*?}' testttt
{It captures this! }
{
It can't
capture this!!! why?
}

或者,如果pcregrep可用,

$ pcregrep -Mo '(?s){.*?}' testttt
{It captures this! }
{
It can't
capture this!!! why?
}

答案2

为了触发多行搜索,grep您必须添加一些选项,因此请尝试:

 grep -Pzo '(?s){.*?}' testttt

可以找到具有很好解释的解决方案(并且被盗用:))来自堆栈溢出

如果您有,pcregrep您可能会发现它在一般情况下更有用,因为它支持 PERL 5 正则表达式。

相关内容