我在回答另一个问题后正在玩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'
。