如何解决更新锚中定义的对象字段
item_value: &item_value
value: true
array:
- name: item_1
<<: *item_value
- name: item_2
<<: *item_value
我想更新第一项的值以获得如下内容:
array:
- name: item_1
value: false
- name: item_2
value: true
我发现类似的唯一方法是使用我发现的这个表达式in the yq (v4) documentation:
yq e '( explode(.) | .array.[] | select(.name == "item_1") | .value = false ) as $test | explode(.) | .array.[] |= (. as $cur | $cur * ($test | select(.name == $cur.name)))' test.yaml
这看起来真的很棘手,我注意到使用以下较短的表达式,我得到了相同的(糟糕的)结果(我不明白为什么这个方法有效):
yq e '( explode(.) | .array.[] | select(.name == "item_1") | .value = false ) as $test' test.yaml
结果:
item_value:
value: false
array:
- name: item_1
value: false
- name: item_2
value: false
解决方法
使用 yq(Python 版本,而不是您使用的 Go 版本) 我可以解决你的任务。
#!/bin/bash
FILE='
item_value: &item_value
value: true
array:
- name: item_1
<<: *item_value
- name: item_2
<<: *item_value
'
yq -y --arg name "item_1" '(.array[] | select(.name == $name) | .value) |= false' <<< "$FILE"
输出
item_value:
value: true
array:
- value: false
name: item_1
- value: true
name: item_2
使用 yq(您正在使用的 Go 版本)我也得到了具有相同表达式的错误输出。
为什么表达式中需要 explode(.)
?
yq e '(.array[] | select(.name == "item_1") | .value) |= false' test.yaml
输出
item_value: &item_value
value: false
array:
- name: item_1
!!merge <<: *item_value
- name: item_2
!!merge <<: *item_value
,
解决方案是使用merge来断开到别名的持久链接:
yq e '(.array[] | select(.name=="item_1")) |= explode(.) * {"value": false}' test.yaml
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。