在 sed 中使用分号作为命令分隔符的可移植性如何?

How portable is it to use semi-colons as command separators in sed?

提问人:William Pursell 提问时间:6/8/2011 更新时间:12/25/2013 访问量:3006

问:

在 sed 中,使用多个用分号分隔的命令是相当常见的:

$ sed -e '/re/{s//replace/p; q;}

但是,标准(例如 http://pubs.opengroup.org/onlinepubs/9699919799/ )只允许 换行符作为分隔符:

$ sed -e '/re/{
    s//replace/p
    q
}

是否有许多仍在使用的 sed 常见实现不允许使用分号?IOW,打算用于移植的 sed 脚本可以使用分号吗?

SED

评论


答:

3赞 Fredrik Pihl 6/9/2011 #1

棘手的...我能找到的唯一参考资料是在 sed-faq 第 6.8.1 章

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

对不工作的唯一参考是 ,参见第 7 章;HHSED

评论

1赞 Jürgen A. Erhard 3/2/2013
奇怪的是,命令分隔符没有记录在 sed(至少是 GNU)的文档中(不,我认为是额外的材料,您不需要它来获取完整信息)。
1赞 Jonathan Leffler 6/9/2011 #2

GNU似乎允许在MacOS X(BSD)不允许的一些地方使用分号。我现在没有触手可及的细节,但有几次我不得不修改答案才能让它们在 Mac 上正常工作。问题可能出在大括号封闭的命令序列上。sedsed

评论

1赞 stevesliva 8/15/2017
在最低限度上,BSD sed 似乎坚持在关闭大括号之前使用最后一个分号,而 GNU sed 则不然。 GNU: BSD:{n;p}{n;p;}
9赞 Abbafei 12/25/2013 #3

sed 的 POSIX 规范来看:

除 {abcirtw# 之外的命令谓词后跟 a , 可选字符和另一个命令谓词。但是,当 s 命令谓词与 w 标志一起使用时,以这种方式在它后面使用另一个命令会产生未定义的结果。<semicolon><blank>

因此,除了上面提到的命令之外,大多数命令都可以用分号分隔。

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