You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用yq结合properties文件修改YAML中的列表嵌套映射

解决YAML数组元素更新时丢失短横线的问题

问题场景

需要更新YAML中createVnicDetails列表内subnetIdRef.name,以及sourceDetails列表内sourceId的值,但使用yq '. *= load_props("/compute.properties")'命令后,原YAML中的数组短横线(-)丢失,数组被转为普通对象。

原YAML内容:

apiVersion: core.oci.upbound.io/v1alpha1
kind: Instance
metadata:
  name: crossplane-inst-flat
spec:
  forProvider:
    compartmentIdRef:
      name: compartment-oke-shu
    createVnicDetails:
      - subnetIdRef:
          name: crossplane-srg-subnet
    availabilityDomain: "yyy:PHX-AD-1"
    shape: "VM.Standard2.1"
    sourceDetails:
      - sourceId: ocid1.image.oc1.phx.7ytytytytytyt
        sourceType: "image"
    displayName: crossplane-inst-flat

使用的compute.properties内容:

spec.forProvider.createVnicDetails.subnetIdRef.name=test
spec.forProvider.sourceDetails.sourceId=ocid1.image.oc1.phx.hhhh
spec.forProvider.sourceDetails.sourceType=image

原因

load_props加载的properties文件路径是针对对象结构的,而原YAML中createVnicDetails和sourceDetails是数组结构。直接用*=合并时,yq会将数组节点替换为对象,导致数组标识(短横线)丢失。

解决方法

方法1:修改properties文件,指定数组索引

将properties文件中的路径改为包含数组索引的形式,明确指向数组的第一个元素:

spec.forProvider.createVnicDetails[0].subnetIdRef.name=test
spec.forProvider.sourceDetails[0].sourceId=ocid1.image.oc1.phx.hhhh
spec.forProvider.sourceDetails[0].sourceType=image

然后执行yq命令进行合并:

yq '. |= load_props("/compute.properties")' config.yaml

该命令会正确定位到数组内的元素进行更新,保留原数组结构。

方法2:不修改properties文件,用yq逐个指定更新路径

如果不想修改properties文件,可以先加载properties内容到变量,再逐个更新数组元素:

yq '
  $props = load_props("/compute.properties");
  .spec.forProvider.createVnicDetails[0].subnetIdRef.name = $props.spec.forProvider.createVnicDetails.subnetIdRef.name;
  .spec.forProvider.sourceDetails[0].sourceId = $props.spec.forProvider.sourceDetails.sourceId;
  .spec.forProvider.sourceDetails[0].sourceType = $props.spec.forProvider.sourceDetails.sourceType
' config.yaml

这种方式通过显式指定数组索引,避免破坏原数组结构,同时完成目标字段的更新。

内容的提问来源于stack exchange,提问作者Shubham Jain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 01:01:24