linux sed:-i不能在Mac OS X上与stdin一起使用

iyfjxgzm  于 2023-04-11  发布在  Linux
关注(0)|答案(5)|浏览(232)

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

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上抛出错误。我不知道为什么。有人能帮忙吗?
谢谢

zrfyljdw

zrfyljdw1#

问题是Mac OS X使用的是BSD版本的sed,它对-i选项的处理方式略有不同。Linux中使用的GNU版本接受一个带有-i的可选参数:如果存在,sed会创建一个备份文件,其名称由输入文件加上参数组成。如果没有参数,sed只会修改输入文件,而不会保存原始文件的备份。
在BSD sed中,-i的参数是必需的。为了避免备份,您需要提供一个零长度的参数,例如sed -i '' y.tab.c ...
在Linux中,您的命令只是编辑y.tab.c而没有备份,它会尝试使用'y.tab.c'作为扩展名保存备份文件。但是现在,命令行中没有其他文件,sed认为您想要就地编辑标准输入,这是不允许的。

s71maibg

s71maibg2#

来自sed手册页:

-i扩展名就地编辑文件,使用指定的扩展名保存备份。如果指定了零长度扩展名,则不会保存备份。就地编辑文件时,不建议指定零长度扩展名,因为在磁盘空间耗尽的情况下,可能会损坏或就地保存部分内容等。
解决方案是发送一个零长度的扩展,如下所示:

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

41ik7eoe3#

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

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

q8l4jmvw4#

  • 从@chepner的解释中背出一个快速而肮脏的解决方案:*

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

  • (自制软件社区相当清楚OS X内置程序可能会出现意外覆盖的问题,并且已经努力避免对大多数替代发行版命令进行覆盖。
kxkpmulp

kxkpmulp5#

顺便说一句我想

作为Slipp D. Thompson suggested,我在macOS中使用了如下的gsed,这在linux中类似(从gsed中删除g):

find . -name "*.tex" -print0 | xargs -0 gsed -i '1s/^/% !TEX spellcheck = en-US \n/'

按预期工作😀

相关问题