使用sed -i修改YAML文件变量报错,如何实现文件覆盖?
解决sed -i修改YAML文件时的"extra characters at the end of d command"错误
这个问题我之前在macOS环境下也踩过坑!原因是不同版本的sed对-i参数的语法要求不一样:你用的是Linux上GNU sed的写法,但如果是在macOS(BSD sed)环境下,-i参数必须指定一个备份文件的后缀(哪怕你不想保留备份),否则就会报这个错误。
正确的解决方法
方法1:适配macOS(BSD sed)的命令
直接给-i后面加一个空字符串后缀(注意-i和''之间不能有空格),这样既不会生成备份文件,又能直接修改原文件:
sed -i '' 's/%APP_NAME%/newappname/g' app.yaml
方法2:兼容Linux和macOS的写法(可选)
如果你需要跨平台兼容,可以用这种写法,它会生成一个.bak备份文件,之后你可以手动删除:
sed -i.bak 's/%APP_NAME%/newappname/g' app.yaml # 可选:删除备份文件 rm app.yaml.bak
验证修改结果
执行命令后,你可以查看修改后的YAML文件内容:
cat app.yaml
应该会看到预期的结果:
... metadata: name: appname spec: replicas: 3 selector: matchLabels: app: newappname
小提示
如果不确定替换规则是否正确,可以先不加-i参数测试输出,确认没问题后再执行修改原文件的命令:
sed 's/%APP_NAME%/newappname/g' app.yaml
内容的提问来源于stack exchange,提问作者Beno Odr




