sed,上下文地址范围相同的行为?

sed,上下文地址范围相同的行为?

这些命令按预期工作: 情况 1、2:

$ printf "a\nb\nc\n" | sed -n '/a/ p'
a

$ printf "a\nb\na\n" | sed -n '/a/,/a/ p'
a
b
a

但是我预计以下命令仅匹配“a”,并且我无法理解两个地址范围的记录定义:

情况3、4:

$ printf "a\nb\nc\n" | sed -n '/a/,/a/ p'
a
b
c

$ printf "a\nb\nc\n" | sed -n '/b/,/b/ p'
b
c

谁能进一步解释这个定义的行为?

SED Command: [addr[,addr]f[args]

$ 人 sed

“...在第二个地址是上下文地址的情况下,sed 不会将第二个地址与与第一个地址匹配的模式空间重新匹配。从所选范围后面的第一行开始,sed 开始再次查找第一个地址……”

谢谢

答案1

重要的部分是:

sed 不会将第二个地址与与第一个地址匹配的模式空间重新匹配

你引用的最后一部分相当令人困惑;我更喜欢这一段我有的联机帮助页:

关于地址范围需要注意的三件事:语法是addr1,addr2(即地址由逗号分隔);匹配的行将 addr1 始终被接受,即使addr2选择了较早的行;如果addr2是正则表达式,则不会针对addr1匹配的行进行测试。

最后一个“注意事项”解释了您所看到的行为。当你跑步时

printf "a\nb\nc\n" | sed -n '/a/,/a/ p'

sedmatches /a/,然后继续复制其模式空间,直到/a/再次匹配,在另一条线上,这永远不会发生。

相关内容