使用 jq 更新字典数组中的一个值
Update one value in array of dicts, using jq
我想更新字典中的一个值,我只能通过字典中的另一个值来识别它。也就是说,给定此输入:
[
{
"format": "geojson",
"id": "foo"
},
{
"format": "geojson",
"id": "bar"
},
{
"format": "zip",
"id": "baz"
}
]
我想将 baz
的伴随格式更改为 'csv':
[
{
"format": "geojson",
"id": "foo"
},
{
"format": "geojson",
"id": "bar"
},
{
"format": "csv",
"id": "baz"
}
]
我发现这行得通:
jq 'map(if .id=="baz" then .format="csv" else . end)' my.json
但这看起来有点冗长,所以我想知道是否有更优雅的表达方式。 jq 似乎缺少某种表达式选择器,相当于 xpath 中的 [@id='baz']
。
(刚开始做这道题的时候,我有[.[] |...]
,然后我发现map
,所以它并没有我想象的那么糟糕。)
您要找的是复杂的作业:
jq '(.[] | select(.id == "baz") | .format) |= "csv"' my.json
根据要求,也许不会更短,但会更优雅。请参阅文档的最后一部分:http://stedolan.github.io/jq/manual/#Assignment
编辑:使用 map
:
jq 'map((select(.id == "baz") | .format) |= "csv")' my.json
我想更新字典中的一个值,我只能通过字典中的另一个值来识别它。也就是说,给定此输入:
[
{
"format": "geojson",
"id": "foo"
},
{
"format": "geojson",
"id": "bar"
},
{
"format": "zip",
"id": "baz"
}
]
我想将 baz
的伴随格式更改为 'csv':
[
{
"format": "geojson",
"id": "foo"
},
{
"format": "geojson",
"id": "bar"
},
{
"format": "csv",
"id": "baz"
}
]
我发现这行得通:
jq 'map(if .id=="baz" then .format="csv" else . end)' my.json
但这看起来有点冗长,所以我想知道是否有更优雅的表达方式。 jq 似乎缺少某种表达式选择器,相当于 xpath 中的 [@id='baz']
。
(刚开始做这道题的时候,我有[.[] |...]
,然后我发现map
,所以它并没有我想象的那么糟糕。)
您要找的是复杂的作业:
jq '(.[] | select(.id == "baz") | .format) |= "csv"' my.json
根据要求,也许不会更短,但会更优雅。请参阅文档的最后一部分:http://stedolan.github.io/jq/manual/#Assignment
编辑:使用 map
:
jq 'map((select(.id == "baz") | .format) |= "csv")' my.json