jq:更改 select 对象中的多个值

jq: change multiple values within a select object

我有一个 JSON 对象数组,我正在尝试使用以下输入更改给定 @type 对象上的 nameversion

[
 {
    "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"} // .)