/(.+)\n\1/ 可以工作,但 /(.*)\n\1/ 在它们都应该工作时却不起作用

/(.+)\n\1/ 可以工作,但 /(.*)\n\1/ 在它们都应该工作时却不起作用

我在回答另一个问题后正在玩sed,我注意到.+并且.*没有给出相同的结果当它们都匹配多个字符时在上下文地址中。
以下命令1

sed -E '$!N;/(.+)\n\1/!P;D' <<IN
one
one_more
two
two_more
IN

印刷

one_more
two_more

好的,这就是预期的输出。
将正则表达式从更改为.+.*即从一个或多个字符零个或多个字符) 应该给出相同的结果,但它没有:

sed -E '$!N;/(.*)\n\1/!P;D' <<IN
one
one_more
two
two_more
IN

只打印一行

two_more

这里发生了什么 ?


1:我使用 ERE 是为了简单/可读性,使用 BRE 时也会发生同样的情况

答案1

发生这种情况是因为/(.*)\n\1/还匹配一个简单的换行符(\n:空字符串,后跟换行符,后跟相同的从头开始为空字符串)。

one_more\ntwo因此它也将匹配您示例中的字符串。

为了避免这种情况,您必须锚定您的正则表达式,例如sed -E '$!N;/^(.+)\n\1/!P;D'sed -E '$!N;/^(.*)\n\1/!P;D'

相关内容