无参数-i可用:是GNU sed --posix有BUG还是BSD sed不符合POSIX?
关于sed
-i 选项兼容性疑问的解答 你提到的两种可能性均不成立,核心原因是POSIX 标准从未定义过 sed 的 -i 选项,-i 本身就是各实现方自行添加的扩展功能,不在POSIX的约束范围内。
具体说明
- GNU sed 的
--posix选项的设计逻辑是「禁用GNU对POSIX已有规定功能的扩展修改」,并不会移除POSIX完全没有定义的额外功能选项,因此--posix模式下依然支持无参数的-i用法是符合设计预期的,不属于BUG。 - BSD sed 要求
-i必须跟随备份后缀参数,不需要备份时需显式传入空字符串(即-i ''),这是BSD实现的自定义设计,也不违反POSIX规范,因为POSIX根本没有对-i选项的用法做任何约定。
跨平台兼容建议
如果需要编写同时兼容GNU sed和BSD sed的脚本,可以统一使用带备份后缀的写法:
sed -i.bak -n '1,25p' *.txt && rm *.txt.bak
这种写法在两个平台都可以正常运行,执行后会自动删除生成的备份文件。
内容的提问来源于stack exchange,提问作者Enlico
相关产品推荐
相关产品推荐

