Plainnotes

sed -i 在 macOS 和 Linux 上不一样

2025-10-15 · 2 分钟工具

同一个脚本在 Linux 上跑得好好的,到 macOS 上报 sed: 1: "file": invalid command code f。

原因是 BSD sed 的 -i 必须带备份后缀参数,sed -i '' 's/a/b/' file,空字符串表示不留备份;GNU sed 的 -i 后面直接跟表达式,-i.bak 才是留备份。

跨平台写法有两种:判断系统

if sed --version >/dev/null 2>&1; then
  sed -i 's/a/b/' file
else
  sed -i '' 's/a/b/' file
fi

或者干脆改用 perl -pi -e 's/a/b/' file,两边行为一致。

还有个通用建议:-i 前先 cp 一份,尤其是正则里带 .* 的时候,改错了没得回头。