1

我使用 pcregrep 编写了一个正则表达式,一切都按预期运行,直到我添加了一个积极的前瞻。

设想:

我有以下文本文件:

a
b
c
a
c

目标:

我想使用带有 pcregrep 的正则表达式来返回一个包含的行a和一个包含的行,其中包含c一个捕获的行。所以它会捕获前三行 ( , , ) 并返回第一 ( ) 和第三 ( ) 行。它不会捕获第四行和第五行,因为它们之间没有线。所以输出将是:babcacb

a
c

我试过的

如果我运行pcregrep -M 'a\nb\nc\n'命令 1),这将捕获并返回:

a
b
c

正如预期的那样。所以我现在想修改它以捕获b具有积极前瞻的行。我试过这个:(pcregrep -M 'a\n(?=(b\n))c\n'命令2)。但是,这不会返回任何内容。

我的问题:

为什么命令 2不返回预期的输出,而命令 1呢?如何返回所需的结果?我知道除了 之外还有其他方法可以做到这一点pcregrep,但请注意我想使用它,pcregrep因为我将扩展功能以解决类似问题。

谢谢!

4

2 回答 2

2

您可以使用带有-o选项的 2 个捕获组:

pcregrep -M -o1 -o2 '(a\n)b\n(c)\n' file

a
c

细节:

  • (...):在正则表达式中,它用于捕获组
  • -o1 -o2: 仅打印捕获组 #1 和 #2

请注意,您的正则表达式a\n(?=(b\n))c\n将不起作用,因为前瞻只是零宽度匹配的断言。您的正则表达式断言b\nafter a\nwhich 的存在很好,但它会立即尝试匹配c\n a\n这就是匹配失败的地方。

于 2019-05-31T19:06:42.210 回答
1

为什么命令 2 不返回预期的输出,而命令 1 呢?因为命令 2 是一个不同的表达式

(?=…)是一个零宽度的前瞻

您指定的是:我想要一个a, 后跟一个换行符,b然后是一个换行符。在那个位置,我还想要一个c后跟换行符。

PS只是得到a和c也许这会有所帮助?

pcregrep -M 'a\nb\nc\n' | pcregrep -M 'a|c'

于 2019-05-31T19:01:01.713 回答