这些命令按预期工作: 情况 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'
sed
matches /a/
,然后继续复制其模式空间,直到/a/
再次匹配,在另一条线上,这永远不会发生。