我在项目中使用了野牛解析器。当我运行以下命令时:
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上抛出错误。我不知道为什么。有人能帮忙吗?谢谢
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认为您想要就地编辑标准输入,这是不允许的。
sed
-i
sed -i '' y.tab.c ...
y.tab.c
s71maibg2#
来自sed手册页:
-i扩展名就地编辑文件,使用指定的扩展名保存备份。如果指定了零长度扩展名,则不会保存备份。就地编辑文件时,不建议指定零长度扩展名,因为在磁盘空间耗尽的情况下,可能会损坏或就地保存部分内容等。解决方案是发送一个零长度的扩展,如下所示:
sed -i '' 's/apples/oranges/' file.txt
41ik7eoe3#
您需要将输入文件作为最后一个参数。
sed -i -e "s/ __attribute__ ((__unused__))$/# ifndef __cplusplus\n __attribute__ ((__unused__));\n# endif/" y.tab.c
q8l4jmvw4#
安装sed的版本,使其能够使用brew install gnu-sed完成工作,然后将脚本中sed的用法替换为gsed。
brew install gnu-sed
gsed
kxkpmulp5#
顺便说一句我想
作为Slipp D. Thompson suggested,我在macOS中使用了如下的gsed,这在linux中类似(从gsed中删除g):
g
find . -name "*.tex" -print0 | xargs -0 gsed -i '1s/^/% !TEX spellcheck = en-US \n/'
按预期工作😀
5条答案
按热度按时间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
认为您想要就地编辑标准输入,这是不允许的。s71maibg2#
来自sed手册页:
-i扩展名就地编辑文件,使用指定的扩展名保存备份。如果指定了零长度扩展名,则不会保存备份。就地编辑文件时,不建议指定零长度扩展名,因为在磁盘空间耗尽的情况下,可能会损坏或就地保存部分内容等。
解决方案是发送一个零长度的扩展,如下所示:
41ik7eoe3#
您需要将输入文件作为最后一个参数。
q8l4jmvw4#
安装sed的版本,使其能够使用
brew install gnu-sed
完成工作,然后将脚本中sed
的用法替换为gsed
。kxkpmulp5#
顺便说一句我想
作为Slipp D. Thompson suggested,我在macOS中使用了如下的
gsed
,这在linux中类似(从gsed
中删除g
):按预期工作😀