如何用yq替换YAML中指定参数的values数组并保留文件其他内容?
用yq替换YAML指定数组并保留完整文件内容
你需要修改YAML文件中parameters块里name为environment的values数组,同时保留文件其余内容。原命令的问题在于使用管道符后只输出了parameters数组的元素,丢失了顶级字段和其他内容。
正确的yq命令(适用于mikefarah/yq v4+)
执行以下命令即可完成替换,同时保留整个YAML结构:
yq '.parameters[] | select(.name == "environment") |= .values = ["foo"]' infile.yml
命令说明
.parameters[]:遍历parameters数组中的每个元素select(.name == "environment"):筛选出name字段为environment的元素|= .values = ["foo"]:对筛选出的元素进行修改,将其values设置为仅包含foo的数组- 整个命令会输出完整的YAML文档,而非仅修改后的部分
执行后结果
name: mything parameters: - name: environment type: string values: - foo - name: destroy type: boolean default: false - name: validate type: boolean default: true variables: - group: storytest - name: version value: "1.0.0"
备选方案(使用sed,仅适用于简单场景)
如果YAML结构固定,也可以用sed进行替换,但局限性较大(比如values的缩进、元素位置变化会失效):
sed -i '/name: environment/,/values:/{/values:/,/^ - name:/s/- .*/- foo/}' infile.yml
内容的提问来源于stack exchange,提问作者timcrall
相关产品推荐
相关产品推荐

