sed:-i可能不适用于Mac OS X上的stdin

我在我的项目中使用野牛parsing器。 当我运行以下命令:

sed -i y.tab.c -e "s/ __attribute__ ((__unused__))$/# ifndef __cplusplus\n __attribute__ ((__unused__));\n# endif/" 

我得到这个错误sed:-i可能不能用于标准input

该命令在Linux机器上正常工作。 我正在使用Mac OS X 10.9。 它仅在mac os x上引发错误。 我不知道为什么。 谁能帮忙?

谢谢

Solutions Collecting From Web of "sed:-i可能不适用于Mac OS X上的stdin"

您需要将输入文件作为最后一个参数。

 sed -i -e "s/ __attribute__ ((__unused__))$/# ifndef __cplusplus\n __attribute__ ((__unused__));\n# endif/" y.tab.c 

问题是Mac OS X使用sed的BSD版本,它对待-i选项的方式稍有不同。 Linux中使用的GNU版本采用可选参数和-i :如果存在, sed创建一个备份文件,其名称由输入文件加上参数组成。 没有参数, sed只是修改输入文件而不保存原始的备份。

在BSD sed-i的参数是必需的。 为了避免做备份,你需要提供一个零长度的参数,例如sed -i '' y.tab.c ...

你的命令只是简单地编辑了y.tab.c而没有在Linux中进行备份,它会尝试使用'y.tab.c'作为扩展名保存备份文件。 但是现在,在命令行中没有其他文件的情况下, sed认为您想要在原地编辑标准输入,这是不允许的。

@ chepner的解释为快速和肮脏的解决方案piggy-back关闭:

安装使用brew install gnu-sed完成工作brew install gnu-sed ,然后用gsed替换脚本中sed用法。

(自制软件社区相当认识到可能出现的问题,OS X的内置插件被意外覆盖,并且已经努力避免大部分备用发行版命令。)

从sed手册页:

-i扩展程序就地编辑文件,使用指定的扩展名保存备份。 如果给定了零长度扩展名,则不会保存备份。 在就地编辑文件时,不建议采用零长度扩展名,因为存在磁盘空间耗尽等情况下的腐败或部分内容的风险。

解决方法是发送一个零长度的扩展,如下所示:

 sed -i '' 's/apples/oranges/' file.txt