Json jq:在选择对象中更改多个值

Json jq:在选择对象中更改多个值,json,select,jq,edit,Json,Select,Jq,Edit,我有一个JSON对象数组,我正在尝试使用以下输入更改给定@type对象的名称和版本 [ { "name": "oldname", "version": "oldversion", "@type": "Project" }, { "name": "bomname", "version": "bomversion", "@type": "BOM" }, { "name": "componentname", "version":

我有一个JSON对象数组,我正在尝试使用以下输入更改给定
@type
对象的
名称和
版本

[
 {
    "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 ]
或者,如果要使用
选择
,可以编写:

map( (select(.["@type"] == "Project") | .name = "newname" | .version  = "newversion" ) // .)
或者更离奇地说:

(.[] | select(["@type"] == "Project"))
|= (.name = "newname" | .version  = "newversion" )
使用您的方法:

[ .[]
  | if .["@type"] == "Project" 
    then .name = "newname" | .version  = "newversion" 
    else . end ]
或者,如果要使用
选择
,可以编写:

map( (select(.["@type"] == "Project") | .name = "newname" | .version  = "newversion" ) // .)
或者更离奇地说:

(.[] | select(["@type"] == "Project"))
|= (.name = "newname" | .version  = "newversion" )

将对象与新值合并

map(select(.["@type"] == "Project") * {name: "newname", version: "newversion"} // .)

将对象与新值合并

map(select(.["@type"] == "Project") * {name: "newname", version: "newversion"} // .)

这三种方法似乎都很好,我一直在尝试使用map()来实现这一点,但我没有必要构建输出数组,就像我最初的post示例一样。我还更好地理解了这里的alternative操作符的用法,以及第三个示例中的update赋值。这三个操作符似乎都很好,我一直在尝试使用map()实现这一点,但我没有必要构建输出数组,就像我最初的post示例一样。我还更好地理解了这里替代运算符的使用,以及第三个示例中的更新赋值。这似乎也可行,它提供了一个我以前从未使用过的递归合并示例。这似乎也可行,它提供了一个我以前从未使用过的递归合并示例。