我在我的项目中使用bison解析器。当我运行以下命令时:
sed -i y.tab.c -e "s/ __attribute__ ((__unused__))$/# ifndef __cplusplus\n __attribute__ ((__unused__));\n# endif/"
我得到了一个错误sed:-i可能不能与stdin一起使用
该命令在linux机器中运行良好。我正在使用MacOSX10.9。它只在mac os x上抛出一个错误,我不知道为什么。有人能帮忙吗?
谢谢
发布于 2014-01-20 20:03:33
您需要将输入文件作为最后一个参数。
sed -i -e "s/ __attribute__ ((__unused__))$/# ifndef __cplusplus\n __attribute__ ((__unused__));\n# endif/" y.tab.c
发布于 2014-01-20 20:04:46
问题在于Mac使用的是sed
的BSD版本,它对-i
选项的处理略有不同。在Linux中使用的GNU版本在-i
中使用一个可选参数:如果存在,sed
将生成一个备份文件,其名称包括输入文件和参数。在没有参数的情况下,sed
只修改输入文件而不保存原始文件的备份。
在BSD sed
中,-i
参数是必需的。为了避免备份,您需要提供一个零长度的参数,例如sed -i '' y.tab.c ...
。
您的命令只是在Linux中编辑没有备份的y.tab.c
,它将尝试使用'y.tab.c‘作为扩展名保存备份文件。但是现在,在命令行中没有其他文件,sed
认为您想就地编辑标准输入,这是不允许的。
发布于 2017-03-08 09:43:04
来自sed命令页:
-i扩展名编辑文件到位,用指定的扩展名保存备份.如果提供了零长度扩展,则不会保存备份。不建议在就地编辑文件时提供零长度的扩展名,因为在磁盘空间耗尽的情况下,可能会发生损坏或部分内容在原地的情况下。
解决方案是发送一个零长度扩展,如下所示:
sed -i '' 's/apples/oranges/' file.txt
https://stackoverflow.com/questions/21242932
复制相似问题