YQ 4.2.x+按指定列表替换YAML列表对应子字段targetRevision值
yq 4.2+ 定向替换YAML字段实现方案
需求说明
使用4.2.x及以上版本的yq工具处理YAML配置文件:
- 待匹配名称列表:
replace_list=[argocd,argocd-projects] - 目标替换值:
replace_to_value=v1.0.0 - 替换规则:定位
server.additionalApplications数组中,name字段属于待匹配列表的元素,将其对应的source.targetRevision字段值统一替换为v1.0.0,不在匹配列表内的元素该字段值保持不变。
可用命令
基础版(固定匹配规则)
执行以下命令会直接在终端输出修改后的YAML内容,验证输出符合预期后可加-i参数原地修改原文件:
yq ' .server.additionalApplications[] |= ( select(.name == ("argocd", "argocd-projects")) | .source.targetRevision = "v1.0.0" )' argocd/argocd-install/values-override.yaml
复用版(参数抽离为变量)
如果需要频繁调整匹配规则、替换值或目标文件路径,可以使用变量传参的写法:
# 可根据实际需求修改以下变量值 REPLACE_LIST=("argocd" "argocd-projects") REPLACE_TO_VALUE="v1.0.0" TARGET_FILE="argocd/argocd-install/values-override.yaml" # 执行替换:去掉-i参数则仅打印结果不修改原文件,加-i则原地写入文件 yq -i ' .server.additionalApplications[] |= ( select([$replace_list] | contains([.name])) | .source.targetRevision = $replace_to )' --arg replace_to "$REPLACE_TO_VALUE" --arg replace_list "$(IFS=,; echo "${REPLACE_LIST[*]}")" "$TARGET_FILE"
逻辑说明
- 原有读取命令
.server.additionalApplications.[] | (.source.targetRevision)仅实现字段取值,未结合更新运算符|=,无法保留原YAML结构完成定向修改 |=是yq的更新运算符,会遍历指定路径下的所有元素,对符合条件的元素执行修改后回写到原结构,不符合条件的元素保持原有内容不变select()负责条件过滤,仅对name命中匹配列表的元素执行后续字段赋值操作- 执行命令时先不要加
-i参数,确认终端输出内容完全符合预期后,再加-i执行原地文件修改,避免原文件被误改。
内容的提问来源于stack exchange,提问作者SweedInsight
相关产品推荐
相关产品推荐

