我在项目中使用了一个野牛解析器。当我运行以下命令时:
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上抛出错误。我不知道为什么。有人可以帮忙吗?
由于
答案 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内置插件被意外覆盖,而且大多数备用发行版命令都没有这样做。)