我在我的项目中使用了一个野牛解析器.当我运行以下命令时:
sed -i y.tab.c -e "s/ __attribute__ ((__unused__))$/# ifndef __cplusplus\n __attribute__ ((__unused__));\n# endif/"
Run Code Online (Sandbox Code Playgroud)
我得到这个错误sed:-i可能不会与stdin一起使用
该命令在linux机器上运行良好.我使用的是Mac OS X 10.9.它仅在mac os x上抛出错误.我不知道为什么.有人可以帮忙吗?
谢谢
che*_*ner 35
问题是Mac OS X使用BSD版本sed,它对-i选项的处理略有不同.Linux中使用的GNU版本带有一个可选参数-i:如果存在,sed则生成一个备份文件,其名称由输入文件和参数组成.如果没有参数,sed只需修改输入文件而不保存原始备份.
在BSD中sed,参数-i是必需的.为避免进行备份,您需要提供零长度参数,例如sed -i '' y.tab.c ....
您的命令只是y.tab.c在Linux中没有备份编辑,它将尝试使用"y.tab.c"作为扩展名保存备份文件.但是现在,如果命令行中没有其他文件,则sed认为您想要就地编辑标准输入,这是不允许的.
Tre*_*nin 12
您需要将输入文件作为最后一个参数.
sed -i -e "s/ __attribute__ ((__unused__))$/# ifndef __cplusplus\n __attribute__ ((__unused__));\n# endif/" y.tab.c
Run Code Online (Sandbox Code Playgroud)
Kun*_*Xie 11
从sed手册页:
-i extension就地编辑文件,使用指定的扩展名保存备份.如果给出了零长度扩展,则不会保存备份.建议在就地编辑文件时不要给出零长度扩展,因为您可能会在磁盘空间耗尽的情况下出现损坏或部分内容等风险.
解决方案是发送如下所示的零长度扩展:
sed -i '' 's/apples/oranges/' file.txt
Run Code Online (Sandbox Code Playgroud)
附上@chepner 对快速而肮脏的解决方案的解释:
安装将使用 完成工作的 sed 版本brew install gnu-sed,然后将sed脚本中的用法替换为gsed。
(自制软件社区非常清楚 OS X 内置程序可能会出现的问题被意外覆盖,并且已努力避免对大多数备用发行版命令执行此操作。)
| 归档时间: |
|
| 查看次数: |
15659 次 |
| 最近记录: |