0

我有一个看起来像这样的 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

我发现有类似的唯一方法是使用我在 yq (v4) 文档中找到的这个表达式:

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
4

2 回答 2

0

使用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 版本)我也会得到具有相同表达式的错误输出。

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

用作输入

array:
  - name: item_1
    value: true
  - name: item_2
    value: true

一切正常:

yq e '(.array[] | select(.name == "item_1") | .value) |= false' test.yaml

array:
  - name: item_1
    value: false
  - name: item_2
    value: true

所以这是这个yq实现中的一个错误。

于 2021-07-01T17:07:36.247 回答
0

解决方案是使用合并来断开到别名的持久链接:

yq e '(.array[] | select(.name=="item_1")) |= explode(.) * {"value": false}' test.yaml
于 2021-07-09T09:45:20.493 回答