我有理想的 JSON:
{
"environments":[
{
"name":"test",
"release":"2.0"
},
{
"name":"prod",
"release":"1.0"
},
]
}
此文件可以处于任何状态:
我需要在给定环境下更新或创建给定版本的“release”标签。
我尝试了以下变体:
(.environments[] | select(.name == "prod") | .release) = "3.0" // .environments += [{"name": "prod", "release": "3.0"}]
我也尝试过:
.environments
|= (map(.name) | index("prod")) as $ix
| if $ix
then .[$ix]["release"] = "2.0"
else . + [{name: "release", value: "2.0"}]
end
但是它要么在空文件上失败。或者不创建新条目。 我在这里迷路了。
jq --arg release 2.2 '.environments += [{"name":"prod","release":$release}]
| del(.environments[]
| select(.name == "prod" and .release != $release))' file.json
在以下 4 个文件上进行测试:
echo '{}' > 1.in
echo '{"environments":[]}' > 2.in
echo '{"environments":[{"name":"test","release":"2.0"}]}' > 3.in
echo '{"environments":[{"name":"test","release":"2.0"},{"name":"prod","release":"1.0"}]}' > 4.in
您可以创建一个
INDEX
,然后更新 .prod
字段。这样,如果存在,则更新它;如果不存在,则创建它。然后,迭代项目以恢复数组。初始 nulls = []
负责处理第一个空对象情况。
.environments |= [(nulls = [] | INDEX(.name) | .prod = {name: "prod", release: "2.0"})[]]