在 OS X 上使用 sed 会和 GNU 上不太一致,在此记录。

  1. OS X sed 不可忽略备份扩展

不可忽略备份扩展

在 OS X 上进行文本替换时,必须要指定备份扩展,即使扩展可以为空。比如:

sed -i  's/foo/bar/g' target

上面这行代码,可以在 GNU 上运行,作用是将 foo 替换为 bar,并且直接修改目标文件(-i)。但是如果在 OS X 上,这行命令会报错:

$ sed -i 's/foo/bar/g' target 
sed: 1: "target": undefined label 'arget'

原因是在 OS X 上,sed 命令必须指定备份的扩展格式:

$ man sed

-i extension
Edit files in-place, saving backups with the specified extension. If a zero-length extension is given, no backup will be saved. It is not recommended to give a
zero-length extension when in-place editing files, as you risk corruption or partial content in situations where disk space is exhausted, etc.

所以需要修改为

sed -i '' 's/foo/bar/g' target

没有好的方法避免创建备份文件问题,以下的方法都做不到兼容:

  • sed -i -e ... - 在 OS X 上不起作用,会创建 -e 备份
  • sed -i'' -e ... - 在 OS X 10.6 不起作用,但在 10.9+ 可行
  • sed -i '' -e ... - 在 GNU 上不起作用

或者,在 OS X 使用 gnu-sed 代替 sed:

brew install gnu-sed
alias sed=gsed

又或者,使用其他命令:

perl -i -pe's/foo/bar/g' target

参考