带有 -i 选项的 sed 命令在 Mac 上失败,但在 Linux 上有效

新手上路,请多包涵

我已成功使用以下 sed 命令在 Linux 中搜索/替换文本:

 sed -i 's/old_link/new_link/g' *

但是,当我在我的 Mac OS X 上尝试它时,我得到:

“命令 c 需要 \ 后跟文本”

我以为我的 Mac 运行的是普通的 BASH shell。这是怎么回事?

编辑:

根据@High Performance,这是由于Mac sed 具有不同的(BSD)风格,因此我的问题是如何在BSD sed 中复制此命令?

编辑:

这是一个导致此问题的实际示例:

 sed -i 's/hello/gbye/g' *

原文由 Yarin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 464
2 个回答

如果您使用 -i 选项,您需要为备份提供扩展名。

如果你有:

 File1.txt
File2.cfg

该命令(注意 -i''-e 之间没有空格,以使其在新版本的 Mac 和 GNU 上工作):

 sed -i'.original' -e 's/old_link/new_link/g' *

创建 2 个备份文件,例如:

 File1.txt.original
File2.cfg.original

没有可移植的方法来避免制作备份文件,因为不可能找到适用于所有情况的 sed 命令组合:

  • sed -i -e ... - 在 OS X 上不起作用,因为它创建 -e 备份
  • sed -i'' -e ... - 不适用于 OS X 10.6 但适用于 10.9+
  • sed -i '' -e ... - 不适用于 GNU

注意 鉴于没有适用于所有平台的 sed 命令,您可以尝试使用另一个命令来获得相同的结果。

例如, perl -i -pe's/old_link/new_link/g' *

原文由 Sinetris 发布,翻译遵循 CC BY-SA 4.0 许可协议

我相信在 OS X 上使用 -i 时 需要 备份文件的扩展名。尝试:

 sed -i .bak 's/hello/gbye/g' *

使用 GNU sed 扩展是 可选 的。

原文由 Dennis Williamson 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题