sed 就地标志,适用于 Mac (BSD) 和 Linux

新手上路,请多包涵

是否有调用 sed 在 Linux 和 Mac 上都可以在没有备份的情况下进行就地编辑?虽然 OS X 附带的 BSD sed 似乎需要 sed -i '' … ,但 GNU sed Linux 发行版通常将文件名解释为空输入备份扩展),并且需要 sed -i … 代替。

是否有任何命令行语法适用于这两种风格,所以我可以在两个系统上使用相同的脚本?

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

阅读 406
2 个回答

如果您真的只想使用 sed -i ‘简单’的方式,以下在 GNU 和 BSD/Mac 上都可以工作 sed

 sed -i.bak 's/foo/bar/' filename

请注意缺少空间和点。

证明:

 # GNU sed
% sed --version | head -1
GNU sed version 4.2.1
% echo 'foo' > file
% sed -i.bak 's/foo/bar/' ./file
% ls
file  file.bak
% cat ./file
bar

# BSD sed
% sed --version 2>&1 | head -1
sed: illegal option -- -
% echo 'foo' > file
% sed -i.bak 's/foo/bar/' ./file
% ls
file  file.bak
% cat ./file
bar

显然你可以删除 .bak 文件。

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

这适用于 GNU sed,但不适用于 OS X:

 sed -i -e 's/foo/bar/' target.file
sed -i'' -e 's/foo/bar/' target.file

这适用于 OS X,但不适用于 GNU sed:

 sed -i '' -e 's/foo/bar/' target.file

在 OS X 上你

  • 不能使用 sed -i -e 因为备份文件的扩展名将设置为 -e
  • 不能使用 sed -i'' -e 出于同样的原因 - 它需要在 -i'' 之间有一个空格。

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

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