【问题标题】:Why GREP can't tolerate multiple \n characters [duplicate]为什么GREP不能容忍多个\ n字符[重复]
【发布时间】: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 不匹配。

标签: regex bash grep multiline


【解决方案1】:

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

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

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

【讨论】:

  • 你是对的。问题不是解析 '\n\n\n' 模式,而是解析/理解/匹配内部 '.'作为'\n'。
猜你喜欢
  • 2016-07-31
  • 2023-03-17
  • 2016-05-07
  • 2016-07-24
  • 1970-01-01
  • 2017-06-26
  • 2015-04-03
  • 2023-03-09
  • 2012-02-23
相关资源
最近更新 更多