首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >-i不能在Mac上与stdin一起使用

-i不能在Mac上与stdin一起使用
EN

Stack Overflow用户
提问于 2014-01-20 19:54:10
回答 4查看 27K关注 0票数 43

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

代码语言:javascript
运行
复制
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上抛出一个错误,我不知道为什么。有人能帮忙吗?

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-01-20 20:03:33

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

代码语言:javascript
运行
复制
sed -i -e "s/  __attribute__ ((__unused__))$/# ifndef __cplusplus\n  __attribute__ ((__unused__));\n# endif/" y.tab.c
票数 15
EN

Stack Overflow用户

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

票数 56
EN

Stack Overflow用户

发布于 2017-03-08 09:43:04

来自sed命令页:

-i扩展名编辑文件到位,用指定的扩展名保存备份.如果提供了零长度扩展,则不会保存备份。不建议在就地编辑文件时提供零长度的扩展名,因为在磁盘空间耗尽的情况下,可能会发生损坏或部分内容在原地的情况下。

解决方案是发送一个零长度扩展,如下所示:

代码语言:javascript
运行
复制
sed -i '' 's/apples/oranges/' file.txt
票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21242932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档