【发布时间】:2021-09-27 15:32:11
【问题描述】:
我有以下示例 json
{
"environment": [
{
"name": "user1",
"value": "app"
},
{
"name": "user2",
"value": "admin"
},
{
"name": "user3",
"value": "db"
}
]
}
当名称存在时,我需要用新值(作为输入参数传递给脚本)更新值。如果给出了不同的名称和值,则需要在最后附加它们作为新字段。 例如,如果 name=user4 和 value=root 那么我的新 json 应该是这样的
{
"environment": [
{
"name": "user1",
"value": "app"
},
{
"name": "user2",
"value": "admin"
},
{
"name": "user3",
"value": "db"
},
{
"name": "user4",
"value": "root"
}
]
}
如果现有值作为 user3,aws 给出,那么它必须更新 user3 的值,如下所示
{
"environment": [
{
"name": "user1",
"value": "app"
},
{
"name": "user2",
"value": "admin"
},
{
"name": "user3",
"value": "aws"
}
]
}
它按预期工作,但只有以下问题。
当我的 JSON 在环境标签之前有任何额外的标签时,在执行命令后,这些标签会被修剪掉,下次当我使用不同的输入运行相同的命令时,它不会找到以前的现有标签并给出此错误 Cannot iterate over null (null)
使用 peak 给出的以下命令,taskDefinition 和 containerDefinitions 标签正在被修剪掉。因此,请帮助我将这些标签放在适当的位置。
jq --arg updateName "user5" --arg updateVal "admin" '
.taskDefinition | .containerDefinitions[] | .environment |=
if any(.[]; .name == $updateName)
then map(if .name == $updateName then .value = $updateVal else . end)
else (. + [{"name": $updateName, "value": $updateVal}] )
end' envt_values1.json
{
"taskDefinition": {
"containerDefinitions": [
{
"environment": [
{
"name": "user1",
"value": "app"
},
{
"name": "user2",
"value": "admin"
},
{
"name": "user3",
"value": "aws"
},
{
"name": "user4",
"value": "root"
},
{}
],
"configuration": []
}
]
}
}
【问题讨论】: