[英]Modifying array of key value in JSON jq
在這種情況下,我有一個原始的json看起來如下:
{
"taskDefinition": {
"containerDefinitions": [
{
"name": "web",
"image": "my-image",
"environment": [
{
"name": "DB_HOST",
"value": "localhost"
},
{
"name": "DB_USERNAME",
"value": "user"
}
]
}
]
}
}
我想原樣修改匹配鍵的值,如下所示:
jq '.taskDefinition.containerDefinitions[0].environment[] | select(.name=="DB_USERNAME") | .value="new"' json
我得到了輸出
{
"name": "DB_USERNAME",
"value": "new"
}
但我希望更多像就地修改或原始的整個json修改新值,如下所示:
{
"taskDefinition": {
"containerDefinitions": [
{
"name": "web",
"image": "my-image",
"environment": [
{
"name": "DB_HOST",
"value": "localhost"
},
{
"name": "DB_USERNAME",
"value": "new"
}
]
}
]
}
}
是否可以使用jq
或任何已知的解決方法?
謝謝。
更新
對於任何尋找編輯多值的人來說,這是我使用的方法
JQ=""
for e in DB_HOST=rds DB_USERNAME=xxx; do
k=${e%=*}
v=${e##*=}
JQ+="(.taskDefinition.containerDefinitions[0].environment[] | select(.name==\"$k\") | .value) |= \"$v\" | "
done
jq '${JQ%??}' json
我認為應該有更簡潔的方式,但這似乎工作正常。
如果您使用|=
,則分配給路徑就足夠了,例如
jq '
(.taskDefinition.containerDefinitions[0].environment[] |
select(.name=="DB_USERNAME") | .value) |= "new"
' infile.json
輸出:
{
"taskDefinition": {
"containerDefinitions": [
{
"name": "web",
"image": "my-image",
"environment": [
{
"name": "DB_HOST",
"value": "localhost"
},
{
"name": "DB_USERNAME",
"value": "new"
}
]
}
]
}
}
您可能想要考慮使用|=
替代方法:
walk( if type=="object" and .name=="DB_USERNAME"
then .value="new" else . end)
這是一個使用|=
的無選擇解決方案:
.taskDefinition.containerDefinitions[0].environment |=
map(if .name=="DB_USERNAME" then .value = "new"
else . end)
避免在LHS的表達式中select
|=
使得解決方案在使用jq的版本時更加健壯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.