我使用pcregrep编写了一个正则表达式,在我添加了一个积极的前瞻之前,一切都按预期进行。
场景:
我有以下文本文件:
a
b
c
a
c
目标:
我想使用正则表达式和pcregrep来返回一个包含a
的行和一个包含c
的行,在它们之间有一个包含b
的行,这是 * 未 * 捕获的。(a
,b
,c
)并返回第一行(a
)和第三行(c
)。它不会 * 捕获第四行和第五行,因为它们之间没有b
行。因此输出将是:
a
c
我所尝试的
如果我运行pcregrep -M 'a\nb\nc\n'
(command 1),这将捕获并返回:
a
b
c
正如预期的那样。所以我现在想修改它以捕获具有正向前看的b
行。我尝试了以下操作:pcregrep -M 'a\n(?=(b\n))c\n'
(command 2),但是没有返回任何结果。
我的问题:
为什么command 2没有返回预期的输出,而command 1可以返回预期的输出?如何返回预期的结果?我知道除了pcregrep
之外还有其他方法可以做到这一点,但请注意,我想使用pcregrep
,因为我将扩展功能来解决类似的问题。
2条答案
按热度按时间pinkon5k1#
您可以使用2个带有
-o
选项的捕获组:详情:
(...)
:在正则表达式中,它用于捕获组-o1 -o2
:仅打印捕获组#1和#2注意,你的正则表达式
a\n(?=(b\n))c\n
不会工作,因为lookahead只是Assert零宽度匹配。你的正则表达式在a\n
之后Assertb\n
的存在,这很好,但它试图匹配c\n
紧接在a\n
之后,这就是匹配失败的地方。a11xaf1n2#
为什么命令2没有返回预期的输出,而命令1却返回?因为命令2是不同的表达式
(?=…)
是零宽度前瞻您指定的是:我想要一个
a
,后面跟着一个换行符,后面跟着一个b
,后面跟着一个换行符。在那个位置,我还想要一个c
,后面跟着一个换行符。pidoss.只是得到a和c,也许这会有帮助?
pcregrep -M 'a\nb\nc\n' | pcregrep -M 'a|c'