在sed中使用分号作为命令分隔符有多方便?

13
在sed中,使用多个命令并用分号分隔的做法相当常见:
$ sed -e '/re/{s//replace/p; q;}
然而,标准(例如http://pubs.opengroup.org/onlinepubs/9699919799/)仅允许使用换行符作为分隔符:
$ sed -e '/re/{
    s//replace/p
    q
}
是否仍有许多常用的sed实现不允许分号?也就是说,一个旨在可移植的sed脚本可以使用分号吗?
3个回答

9

根据POSIX对sed的规定:

除了{, a, b, c, i, r, t, w, :,和#之外的命令动词可以后跟一个<semicolon>,可选的<blank>字符,和另一个命令动词。但是,当使用带有w标志的s命令动词时,在这种方式下跟随它的另一个命令将产生未定义的结果。

所以除了上述提到的命令,大多数命令都可以用分号分开。

/[^\{abcirtw:#];[[:space:]]*/ :-)


3
很棘手...我找到的唯一参考资料是在 sed-faq 第6.8.1章节 中。

大多数版本的 sed 允许在命令行上发出多个命令,用分号 (;) 分隔。

唯一提到 ; 无法工作的参考是针对 HHSED 的,详见 第7章

1
奇怪的是,在sed的(至少GNU)文档中,并没有记录命令分隔符(FAQ不算,我认为它是额外材料,你不应该需要它来获取完整信息)。 - Jürgen A. Erhard

1

GNU sed 似乎允许在一些地方使用分号,而 MacOS X (BSD) sed 不允许。我现在手头没有详细信息,但有几次我不得不修改答案才能使它们在 Mac 上正常工作。问题可能是花括号包含的命令序列。


1
至少在这一点上,BSD sed 似乎坚持在闭合花括号之前加上最后一个分号,而 GNU sed 则不需要。GNU: {n;p} BSD: {n;p;} - stevesliva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接