【发布时间】:2017-09-20 06:15:54
【问题描述】:
我正在尝试使用 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' 字符。
谁能解释一下?
附:我已经绕过了它,首先将 '\n' 字符翻译为 '\a',然后再将它们翻译回来。像下面这个例子:
cat inputFile | tr '\n' '\a' | grep -Po '########## Ligand Number :\s+\d+\a.+?\a\a\a' | tr '\a' '\n'
但我需要了解为什么 GREP 无法理解“\n\n\n”模式。
【问题讨论】:
-
在开头添加
(?s),或将.替换为[\s\S]。在 PCRE 正则表达式中,.默认情况下不匹配换行符,s修饰符启用类似 POSIX 的点行为。 -
@WiktorStribiżew 请仔细阅读我的问题直到最后。我清楚地问“为什么 GREP 不能理解 '\n\n\n' 模式”?
-
计算机无法“理解”任何东西。引擎是否匹配字符串。 PCRE 正则表达式中的
.与\n不匹配。