在回答了另一个问题后,我正在玩弄它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 时也会发生同样的情况
发生这种情况是因为
/(.*)\n\1/
它也匹配一个简单的换行符(\n
: 空字符串,后跟换行符,后跟从头开始的相同空字符串)。所以它也会匹配
one_more\ntwo
你的例子中的字符串。为避免这种情况,您必须锚定正则表达式,例如
sed -E '$!N;/^(.+)\n\1/!P;D'
orsed -E '$!N;/^(.*)\n\1/!P;D'
。