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

使用 yq 有条件地向数组元素添加属性版本 4

如何解决使用 yq 有条件地向数组元素添加属性版本 4

我有一个包含数组的 YAML 文档。我想使用 mikefarah 的 yq version 4 有条件地向该数组的元素添加属性

这是一个示例 YAML 文档。

name: "My Pets"
pets:
- name: "cat"
  age: 8
- name: "dog"
  age: 3
- name: "mouse"
  age: 1

我想把它变成,

name: "My Pets"
pets:
- name: "cat"
  age: 8
  shots: cat.upToDate
- name: "dog"
  age: 3
  shots: dog.upToDate
- name: "mouse"
  age: 1
  shots: mouse.upToDate

我们向 shots 的每个元素添加一个 pets 属性shots 的值应该是 name 的值,点,upToDate

我正在尝试这样的事情,

yq eval '.pets[] | select(.name == "cat").shots = "cat.upToDate"' test.yaml

但这会产生,

name: "cat"
age: 8
shots: cat.upToDate
name: "dog"
age: 3
name: "mouse"
age: 1

我需要保留整个原始 YAML 文档并只插入 shots 属性

这很接近,但缺少所有其他宠物。

yq eval '.pets = (.pets[] | select(.name == "cat").shots = "cats.upToDate")' test.yaml

它产生,

name: "My Pets"
pets:
  name: "cat"
  age: 8
  shots: cats.upToDate

我想也许我们可以将宠物的名字存储在一个变量中并在以后引用它,但今天 v4 对我来说是全新的。

我更喜欢单行,这样我就不必过滤 .name。该数组的元素少于 10 个,因此我可以轻松地对名称进行硬编码并调用 yq 10 次。

有什么想法或建议吗?非常感谢,韦尔登

解决方法

使用 |=,例如像这样:

yq eval '.pets[] |= (.shots = (.name + ".upToDate"))' pets.yaml

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