【问题标题】:How to upsert an array with yq如何用 yq 插入数组
【发布时间】:2022-08-04 14:13:18
【问题描述】:

考虑以下hello.yaml

foos:
  - foo: foo1
    bar: hello
  - foo: foo2
    bar: world

如果我想更新bar 的值foo = \"foo1\",我可以调用以下命令:

yq \'( .foos[] | select(.foo == \"foo1\") | .bar) |= \"goodbye cruel\"\' hello.yaml

并且正确输出:

foos:
  - foo: foo1
    bar: goodbye cruel
  - foo: foo2
    bar: world

但是,如果我不知道我有匹配的项目,我想插入适当的条目,例如像yq \'( .foos[] | select(.foo == \"foo3\") | .bar) ... 这样的东西会输出

foos:
  - foo: foo1
    bar: hello
  - foo: foo2
    bar: world
  - foo: foo3
    bar: goodbye cruel

yq 中有没有办法“更新”数组,或者我是否必须预先评估密钥是否存在并执行两个命令之一来插入或更新?

非常感谢

  • 当前版本没有upsert 方式。最好的选择是检查并插入

标签: yaml yq


【解决方案1】:

就像伊尼安说的;没有 upsert 操作(目前)。这就是我会做的 - 不确定是否有更好的方法?

yq '
  with(.foos ;
    select( all_c(.foo != "foo3")) | . += {"foo": "foo3"}
  ) |
  (.foos[] | select(.foo == "foo3") | .bar) = "cool"
' hello.yaml

解释:

  1. with 块中,匹配数组有 foo: foo3,并添加它。
  2. 接下来,找到所有带有 foo: foo3 的元素并更新它们。

    免责声明:我写了 yq

【讨论】:

    猜你喜欢
    • 2022-11-13
    • 2021-05-14
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 2019-10-12
    相关资源
    最近更新 更多