如何在 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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。