首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果存在yq,则更新嵌套数组对象

如果存在yq,则更新嵌套数组对象
EN

Stack Overflow用户
提问于 2022-05-27 14:41:27
回答 1查看 368关注 0票数 0

有以下YAML如何使用jq

代码语言:javascript
运行
复制
versions:
  - name: test1
    version: "0.0.1"
  - name: test2
    id: "1"

如何用名称完整地更新版本,以填充以下场景:

添加具有新名称的新对象:

  • 名称: test3版本:"0.0.3“

用新版本更新现有对象:

  • 名称: test1版本:"0.1.1“

更新没有版本的现有对象:

  • 名称: test2版本:"0.0.2“

我已经测试了以下命令,但是我得到了一些不希望得到的结果,比如在替换版本时,它保留了旧版本,而不是新版本

代码语言:javascript
运行
复制
yq -i ".versions= (.versions +  {"name": "test", "version": "0.0.5"} | unique_by(.name))" test.yaml
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-27 20:37:20

如果您关心数组的排序(我相信您会这样做),一般的回答是:查找匹配的索引或新索引的默认值,并将这两个字段添加到该索引后面的项(或null)中。

您没有指定正在使用的哪种实施 of yq。虽然解决办法是相似的,但它们肯定不是相同的。

这将是一个使用kislyuk/yq的解决方案

代码语言:javascript
运行
复制
yq='(.versions | .[(to_entries[] | select(.value.name == $name).key) // length]) += {$name, $version}'

# Adding a new object with a new name
yq -y --arg name test3 --arg version 0.0.3 "$yq"

versions:
  - name: test1
    version: 0.0.1
  - name: test2
    id: '1'
  - name: test3
    version: 0.0.3

# Updating an existing object with a new version:
yq -y --arg name test1 --arg version 0.1.1 "$yq"

versions:
  - name: test1
    version: 0.1.1
  - name: test2
    id: '1'

# Updating an existing object with no version:
yq -y --arg name test2 --arg version 0.0.2 "$yq"

versions:
  - name: test1
    version: 0.0.1
  - name: test2
    id: '1'
    version: 0.0.2

使用mikefarah/yq,可以将其转换为:

代码语言:javascript
运行
复制
yq='(.versions | .[(to_entries | .[] | select(.value.name == env(name)).key) // length]) += {"name": env(name), "version": env(version)}'

# Adding a new object with a new name
name=test3 version=0.0.3 yq "$yq"

versions:
  - name: test1
    version: "0.0.1"
  - name: test2
    id: "1"
  - name: test3
    version: 0.0.3

# Updating an existing object with a new version:
name=test1 version=0.1.1 yq "$yq"

versions:
  - name: test1
    version: 0.1.1
  - name: test2
    id: "1"

# Updating an existing object with no version:
name=test2 version=0.0.2 yq "$yq"

versions:
  - name: test1
    version: "0.0.1"
  - name: test2
    id: "1"
    version: 0.0.2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72407115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档