我想知道“sed”的 GNU 和 BusyBox 实现是否可能被破坏。
我的默认 sed 实现是来自 GNU 的。
POSIX 说:
具有两个地址的编辑命令应选择从与第一个地址匹配的第一个模式空间到与第二个地址匹配的下一个模式空间的包含范围。
但那为什么给
$ { echo ha; echo ha; echo ha; } | sed '0,/ha/ !d'
ha
代替
ha
ha
? 显然,这里的第二个“ha”是匹配的“下一个”模式空间,所以它也应该被输出!
但更奇怪的是,
$ { echo ha; echo ha; echo ha; } | busybox sed '0,/ha/ !d'
根本不输出任何东西!
但是,即使 sed 会按照 POSIX 定义所说的那样做,当实际检查范围表达式时应该发生什么仍然不清楚。
每个范围条件都有自己的内部状态吗?还是 sed 脚本中的所有范围条件都有一个全局状态?
显然,一个范围条件至少需要记住它当前是处于“搜索第一个地址的匹配”状态还是“搜索第二个地址的匹配”状态。也许它甚至需要记住第三种状态“我已经处理了范围,无论如何都不会再次匹配”。
更新这些条件当然很重要:每次读取新的模式空间?每次修改模式空间时,比如通过 s 命令?或者只是当控制流达到一个范围条件?
那么,它是什么?
在我知道得更清楚之前,我会避免在我的 sed 脚本中使用范围条件,并认为它们是一个可疑的功能。