微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

更新锚中定义的对象字段

如何解决更新锚中定义的对象字段

我有一个 yaml 文件,如下所示:

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 举报,一经查实,本站将立刻删除。