jq:更改 select 对象中的多个值
jq: change multiple values within a select object
我有一个 JSON 对象数组,我正在尝试使用以下输入更改给定 @type
对象上的 name
和 version
[
{
"name": "oldname",
"version": "oldversion",
"@type": "Project"
},
{
"name": "bomname",
"version": "bomversion",
"@type": "BOM"
},
{
"name": "componentname",
"version": "componentversion",
"@type": "Component"
}
]
我找到了很多更改单个值的示例,我可以通过将多个 select
语句链接在一起来成功地做到这一点。
$ cat original.json | jq '[ .[] | (select(.["@type"] == "Project") | .name ) = "newname" | (select(.["@type"] == "Project") | .version ) = "newversion ] ' > renamed.json
但我希望我可以压缩它,所以我只执行了一次 select
来更改两个值。
使用您的方法:
[ .[]
| if .["@type"] == "Project"
then .name = "newname" | .version = "newversion"
else . end ]
或者如果你想使用select
,你可以这样写:
map( (select(.["@type"] == "Project") | .name = "newname" | .version = "newversion" ) // .)
或更奇特:
(.[] | select(["@type"] == "Project"))
|= (.name = "newname" | .version = "newversion" )
用新值合并一个对象。
map(select(.["@type"] == "Project") * {name: "newname", version: "newversion"} // .)
我有一个 JSON 对象数组,我正在尝试使用以下输入更改给定 @type
对象上的 name
和 version
[
{
"name": "oldname",
"version": "oldversion",
"@type": "Project"
},
{
"name": "bomname",
"version": "bomversion",
"@type": "BOM"
},
{
"name": "componentname",
"version": "componentversion",
"@type": "Component"
}
]
我找到了很多更改单个值的示例,我可以通过将多个 select
语句链接在一起来成功地做到这一点。
$ cat original.json | jq '[ .[] | (select(.["@type"] == "Project") | .name ) = "newname" | (select(.["@type"] == "Project") | .version ) = "newversion ] ' > renamed.json
但我希望我可以压缩它,所以我只执行了一次 select
来更改两个值。
使用您的方法:
[ .[]
| if .["@type"] == "Project"
then .name = "newname" | .version = "newversion"
else . end ]
或者如果你想使用select
,你可以这样写:
map( (select(.["@type"] == "Project") | .name = "newname" | .version = "newversion" ) // .)
或更奇特:
(.[] | select(["@type"] == "Project"))
|= (.name = "newname" | .version = "newversion" )
用新值合并一个对象。
map(select(.["@type"] == "Project") * {name: "newname", version: "newversion"} // .)