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

时间:2014-01-20 19:54:11

标签: linux macos sed

我在项目中使用了一个野牛解析器。当我运行以下命令时:

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

我收到此错误 sed:-i不能与stdin一起使用

该命令在linux机器上运行正常。我使用的是Mac OS X 10.9。它仅在mac os x上抛出错误。我不知道为什么。有人可以帮忙吗?

由于

4 个答案:

答案 0 :(得分:28)

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

在BSD sed中,-i的参数是必需的。为避免进行备份,您需要提供零长度参数,例如: sed -i '' y.tab.c ...

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

答案 1 :(得分:12)

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

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

答案 2 :(得分:9)

来自sed联机帮助页

  

-i扩展名      就地编辑文件,使用指定的扩展名保存备份。      如果给出了零长度扩展,则不会保存备份。它      不建议在就地时提供零长度扩展      编辑文件,因为你冒着腐败或部分内容的风险 -      磁盘空间耗尽等问题

解决方案是发送如下所示的零长度扩展名:

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

答案 3 :(得分:2)

小猪 - 退出@Chepner对快速解决方案的解释:

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

(自制社区非常清楚可能出现的问题,OS X内置插件被意外覆盖,而且大多数备用发行版命令都没有这样做。)