为什么GREP不能容忍多个\ n字符

时间:2017-09-20 06:15:54

标签: regex bash grep multiline

我正在尝试使用GREP从文件中选择多行记录。

记录看起来像那样

########## Ligand Number :       1
blab bla bla
bla blab bla


########## Ligand Number :       2
blab bla bla
bla blab bla


########## Ligand Number :       3
bla bla bla


<EOF>

我正在使用Perl RegEx(-P)。

为了绕过GREP中的多行限制,我使用grep -zo。这样,解析器可以使用多行并输出我想要的内容。一般来说,它工作正常。

然而,问题是这里的分隔符是在最后一条记录行结束后的两个空行(三个连续的'\ n'字符:一个用于结束行,两个用于两个空行)。

当我尝试使用像

这样的表达式时
    grep -Pzo '^########## Ligand Number :\s+\d+.+?\n\n\n' inputFile

它什么都不返回。似乎grep不能容忍连续的'\ n'字符。

有人可以解释一下吗?

P.S。我通过先将'\ n'字符翻译成'\ a'然后翻译它来绕过它。像下面这样的例子:

    cat inputFile | tr '\n' '\a' | grep -Po '########## Ligand Number :\s+\d+\a.+?\a\a\a' | tr '\a' '\n'

但我需要理解为什么无法理解'\ n \ n \ n'模式。

1 个答案:

答案 0 :(得分:1)

在PCRE正则表达式中,.默认情况下与换行符号不匹配,s修饰符启用POSIX类似点行为。

因此,请在开头添加(?s),或将.替换为[\s\S]

(?s)^########## Ligand Number :\s+\d+.+?\n\n\n