我正在尝试使用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'模式。
答案 0 :(得分:1)
在PCRE正则表达式中,.
默认情况下与换行符号不匹配,s
修饰符启用POSIX类似点行为。
因此,请在开头添加(?s)
,或将.
替换为[\s\S]
。
(?s)^########## Ligand Number :\s+\d+.+?\n\n\n