我在文件中有类似这样的内容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 正则表达式。