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

Why GREP can't tolerate multiple \n characters

我正在尝试使用 GREP select 文件中的多行记录。

记录看起来像那样

########## 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

它returns没什么。似乎grep不能容忍连续的'\n'字符。

谁能解释一下?

P.S。我已经通过先将 '\n' 字符翻译成 '\a',然后再将它们翻译回去来绕过它。像下面这个例子:

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

但我需要了解为什么 GREP 无法理解“\n\n\n”模式。

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

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

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