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

sar*_*hau 28 linux macos sed

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

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认为您想要就地编辑标准输入,这是不允许的.

  • `sed -i '' file` 适用于 OSX,但不可移植。它至少在 Cygwin 和 Linux 上都失败了。`sed -i'.bak' file` 是我能找到的最便携的语法,但是你需要在最后执行 `rm file.bak`。 (3认同)
  • 这两种形式都不可移植,因为 POSIX 标准没有指定“-i”选项。为了真正的可移植性,您需要自己处理临时文件: `sed '...' file > file.new; mv文件file.bak;mv 文件.新文件`. (2认同)

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)


Sli*_*son 8

附上@chepner 对快速而肮脏的解决方案的解释:

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

(自制软件社区非常清楚 OS X 内置程序可能会出现的问题被意外覆盖,并且已努力避免对大多数备用发行版命令执行此操作。)