为什么 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
我正在尝试使用 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