使用sed正则捕获组替换YAML字段值未生效问题咨询
问题原因
- 管道左侧的
echo输出未被sed使用:你为sed指定了待处理文件values.yaml,sed会直接读取该文件内容,不会读取管道传入的标准输入,因此你输出的新标签master-abcdef完全没有参与替换逻辑。 - 替换规则逻辑错误:你写的
s/IMAGE_TAG:\s*(\S+)$/\1/g规则的作用是将整行IMAGE_TAG: 旧标签替换为仅保留旧标签值,执行后会直接删掉行首的IMAGE_TAG:,和你的修改目标完全相反。 - 新标签没有传入替换规则:你需要把要替换的新标签作为替换的目标值写入sed的替换表达式后半段,而不是通过管道传递。
解决方案
先将目标标签存入变量,再执行替换即可,根据你的运行环境选择对应命令:
macOS 环境(你当前使用的-i ''语法适配 macOS 自带的 sed 版本)
# 定义要替换的新标签 NEW_TAG="master-abcdef" # 执行替换操作 sed -i '' -E "s/(IMAGE_TAG:\s*)\S+/\1$NEW_TAG/" values.yaml
GNU/Linux 环境(适配 CentOS、Ubuntu 等系统自带的 GNU sed 版本)
NEW_TAG="master-abcdef" sed -i -E "s/(IMAGE_TAG:\s*)\S+/\1$NEW_TAG/" values.yaml
补充说明
如果你的新标签内容中包含/字符,可以将sed的分隔符替换为其他未出现在标签中的字符(比如#),避免语法冲突,示例如下:
sed -i '' -E "s#(IMAGE_TAG:\s*)\S+#\1$NEW_TAG#" values.yaml
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

