如果存在则更新嵌套数组对象 yq
update nested array object if exists yq
有了下面的 YAML 如何使用 jq
versions:
- name: test1
version: "0.0.1"
- name: test2
id: "1"
如何通过名称更新版本满足以下场景:
正在添加一个新名称的新对象:
- 名字:test3
版本:“0.0.3”
用新版本更新现有对象:
- 名称:test1
版本:“0.1.1”
更新没有版本的现有对象:
- 名称:test2
版本:“0.0.2”
我已经测试了以下命令,但是我得到了不想要的结果,比如在替换版本时它保留了旧版本而不是新版本
yq -i ".versions= (.versions + {"name": "test", "version": "0.0.5"} | unique_by(.name))" test.yaml
如果您关心数组的顺序(我相信您会关心),一般答案是:找到匹配的索引或默认为最后一个之后的新索引,并将两个字段都添加到该项目(或 null ) 在该索引后面。
您没有指定 which implementation 的 yq
正在使用。虽然解决方案相似,但它们肯定不相同。
这将是一个使用 kislyuk/yq 的解决方案:
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,这可以转换为:
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
有了下面的 YAML 如何使用 jq
versions:
- name: test1
version: "0.0.1"
- name: test2
id: "1"
如何通过名称更新版本满足以下场景:
正在添加一个新名称的新对象:
- 名字:test3 版本:“0.0.3”
用新版本更新现有对象:
- 名称:test1 版本:“0.1.1”
更新没有版本的现有对象:
- 名称:test2 版本:“0.0.2”
我已经测试了以下命令,但是我得到了不想要的结果,比如在替换版本时它保留了旧版本而不是新版本
yq -i ".versions= (.versions + {"name": "test", "version": "0.0.5"} | unique_by(.name))" test.yaml
如果您关心数组的顺序(我相信您会关心),一般答案是:找到匹配的索引或默认为最后一个之后的新索引,并将两个字段都添加到该项目(或 null ) 在该索引后面。
您没有指定 which implementation 的 yq
正在使用。虽然解决方案相似,但它们肯定不相同。
这将是一个使用 kislyuk/yq 的解决方案:
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,这可以转换为:
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