如何使用mikefarah/yq修改YAML值并返回完整YAML内容
问题描述
现有如下YAML配置:
spec: templates: - name: some_step1 script: image: some_image imagePullPolicy: IfNotPresent - name: some_step2 activeDeadlineSeconds: 300 script: image: some_image imagePullPolicy: IfNotPresent env: - name: HOST value: "HOST" - name: CONTEXT value: "CONTEXT"
需要更新其中some_step2的CONTEXT环境变量值,当前使用的命令为:
yq '.spec.templates | map(select(.name == "some_step2")).[].script.env | map(select(.name == "CONTEXT").value = "CONTEXT1")' test.yaml
该命令仅返回修改后的env部分,而非完整YAML内容。使用的是mikefarah/yq v4.30.6,如何修改命令以完成修改并返回完整YAML?
解决方案
使用以下命令即可修改指定值并返回完整YAML:
yq '.spec.templates[] |= (select(.name == "some_step2").script.env[] |= (select(.name == "CONTEXT").value = "CONTEXT1"))' test.yaml
命令解释
原命令通过管道符逐步缩小了处理范围,最终只输出了env数组部分。而上述命令采用原地更新的方式:
- 遍历
.spec.templates下的每一项 - 筛选出
name为some_step2的项,对其script.env数组进行遍历 - 筛选出
name为CONTEXT的环境变量,修改其value为CONTEXT1
整个过程保留了原始YAML的完整结构,仅修改目标字段。
如果需要直接修改原文件(而非输出到控制台),可以添加-i参数:
yq -i '.spec.templates[] |= (select(.name == "some_step2").script.env[] |= (select(.name == "CONTEXT").value = "CONTEXT1"))' test.yaml
内容的提问来源于stack exchange,提问作者M.M
相关产品推荐
相关产品推荐

