使用yq合并YAML新增字段失败,寻求正确合并方案
合并YAML文件新增字段,保留原有值
现有文件内容
prod.yaml
configMap: data: env: APP_1: "{{ .Data.data.app_1 }}" APP_2: "{{ .Data.data.app_2 }}" APP_3: "{{ .Data.data.app_3 }}" APP_4: "{{ .Data.data.app_4 }}"
updated.yaml
APP_1: APP_2: APP_3: APP_4: APP_5: LOG_DIR:
期望合并结果
configMap: data: env: APP_1: "{{ .Data.data.app_1 }}" APP_2: "{{ .Data.data.app_2 }}" APP_3: "{{ .Data.data.app_3 }}" APP_4: "{{ .Data.data.app_4 }}" APP_5: LOG_DIR:
当前尝试的命令
先用awk生成updated.yaml:
cat .env | awk -F":" '{print $1": \"{{ .Data.data."tolower($1)" }}\""}' > updated.yaml
随后尝试用yq合并,但未成功:
yq '.env[] *=n [load("update.yaml")]' prod.yaml > a.yaml
正确的yq合并方法
使用mikefarah/yq v4+版本,执行以下命令即可完成需求:
yq '.configMap.data.env *= load("updated.yaml")' prod.yaml > a.yaml
如果需要更明确地指定仅新增字段,不覆盖原有字段的任何值(即使updated.yaml中已有字段为空),可以用以下写法:
yq '.configMap.data.env |= (. * load("updated.yaml"))' prod.yaml > a.yaml
错误原因说明
原命令的问题有两点:
- 路径错误:
prod.yaml中的env节点位于.configMap.data下,而非根节点的.env; - 操作符误用:
*=n是数组的合并语法,这里要处理的是YAML对象,应该使用对象合并操作符。
内容的提问来源于stack exchange,提问作者Andres Cabrera
相关产品推荐
相关产品推荐

