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

用 yq 精细并替换 YAML 文件中的数组

如何解决用 yq 精细并替换 YAML 文件中的数组

在我的 Mac 上,我有 yq 并且我想更改以下 YAML 文件

---
- type: replace
  path: /mypath1
  value:
  - "10.244.1.4"
- type: replace
  path: /mypath2
  value:
    - value1
- type: replace
  path: /mypath3
  value:
    - value1
 - type: remove
   path: /mypath4

现在我需要更改此块:

 - type: replace
   path: /mypath2
   value:
     - value1

这样:

 - type: replace
   path: /mypath2
   value:
     - value2
     - value3

但我找不到正确的 yq w ... 命令来执行此操作。我在网上搜索了很多例子,甚至是在 StackOverflow 上,但没有运气。 最好的解决方案是,当“path==/mypath2”我可以用另一个数组设置值字段。 有什么建议吗?

解决方法

假设

最后一个索引(第 16 行)前面缺少空格。要测试以下脚本,请使用以下 yaml 文件:

---
- type: replace
  path: /mypath1
  value:
    - "10.244.1.4"
- type: replace
  path: /mypath2
  value:
    - value1
- type: replace
  path: /mypath3
  value:
    - value1
- type: remove
  path: /mypath4
- type: remove
  path: test

根据您的示例 (yq w...),我假设您使用的是 yq3。

示例

首先要做的是找到正确的查询来隔离要写入的数组。我使用 path 属性来隔离正确的索引,因为它似乎是一个唯一标识符。

$ yq r file.yml '(path==/mypath2).value'
- value1

现在我们有了正确的读取查询,更容易找出写入查询。使用 [+] 运算符将新值附加到现有数组。

$ yq w file.yml '(path==/mypath2).value[+]' "value3"
- type: replace
  path: /mypath1
  value:
    - "10.244.1.4"
- type: replace
  path: /mypath2
  value:
    - value1
    - value3
- type: replace
  path: /mypath3
  value:
    - value1
- type: remove
  path: /mypath4
- type: remove
  path: test

您可以添加 -i,--inplace 选项直接更新 file.yml。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。