如何在 Mac 下使用 sed 命令的 -i 参数

问题

我已经成功地在 Linux 中使用了如下 sed 命令来 搜索/替换 文本:

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

然而,当我尝试在 Mac OS X 上尝试时,我得到了:

"command c expects \ followed by text"

我以为我的 Mac 运行的是正常的 BASH shell。怎么会这样?

EDIT:

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

EDIT:

下面是一个导致这样情况的真实案例:

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

答案

如果你使用 -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 命令可以在所有平台工作,你可以尝试使用另一个命令来达到相同的结果。

E.g., perl -i -pe's/old_link/new_link/g' *

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://stackoverflow.com/questions/4247...

译文地址:https://learnku.com/devtools/t/71679

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!