使用sed替换文本而无需备份时

在制作自动发布的过程中,自动变更 docker-compose.yml里面的版本号的时候,使用如下命令

export APP_VERSION=1.1.16
sed -i "s/zentao:[0-9.]*\"/zentao:${APP_VERSION}\"/g" docker-compose.yml

总是报如下错误:

sed: 1: "docker-compose.yml": extra characters at the end of d command

然而 将替换 -i 参数去除后观察,替换的结果又是正确的。 问了下 AI 回答如下:

如果在添加 -i 参数后出现错误,可能是因为你使用了 macOS 系统。在 macOS 中,sed 命令在使用 -i 参数时需要指定一个备份文件的扩展名,即使不需要备份也要指定一个空字符串。你可以尝试使用以下命令:

sed -i '' "s/zentao:[0-9.]*\"/zentao:1.1.16\"/g" docker-compose.yml
在这个命令中,-i 后面紧跟了两个单引号 '',表示不创建备份文件。这样应该可以解决你遇到的问题。

如此的差别,又发现一个小坑 ^_^

通用方案

可以通过判断 os.name 的方式执行不同的命令以解决 Mac 和 Linux 上脚本的通用性问题.