Whidy Writes

macOS下SED命令保存文件(-i)使用注意事项

发布于:(更新于:

我的 ClashX 每次更新订阅都会重写规则,然而有一些是我自定义的,例如本地的一些域名,需要直连。那么每次订阅更新后都要手动重新修改很麻烦,于是打算写个脚本,通过 SED 命令来处理文本。

通常情况下 SEDLinux 使用没什么问题的,而 macOS 下有些需要注意的,比如 SED 修改文件并保存需要 -i 参数,而直接使用会报错。打个比方:

我需要修改 test.yaml 的某行包含 51.la 并删除,一般执行:

sed -i '/51.la/d' test.yaml

然而在 macOS 下,会报错 sed: 1: "test.yaml": command i expects \ followed by text 。令人不解,查了些资料,有如下两个解决方案。

通用方案一

sed -i'.original' -e '/51.la/d' test.yaml

那么他会保存一个原始备份文件,并执行修改保存 test.yaml

有人说是 macOS 的 sed 命令太旧了,试试输入 man sed ,确实看到竟然是 2005 年的,并且不支持 sed --version ,而我的 CentOS 7 的服务器则可以查到版本为 sed (GNU sed) 4.2.2

也有人说可以用 brew 装个 gsed 来满足,我不想装太多东西,有兴趣你可以试试。

更适合 macOS 下的方案二

当然还有一个方案,直接使用如下命令:

sed -i '' '/51.la/d' test.yaml

这样就不会生成新的备份文件直接修改了。不过这个命令会有兼容性问题,虽然在当代是基本可以忽略的,底部 stackoverflow 中的回答有详细说明。

相关参考

The OSX seds are based on older versions, you need to be much more literal in your directions to sed, AND you're lucky, in this case, sed is telling you exactly what to do. Untested as I don't have OSX, but try ...

avatar

whidy

一名爱折腾的前端开发工程师,喜欢打篮球和分享 ฅʕ•̫͡•ʔฅ