Json 使用变量编辑嵌套数组中的值

Json 使用变量编辑嵌套数组中的值,json,jq,edit,Json,Jq,Edit,我有以下我无法解决的JQ问题。给定JSON: { “版本”:“2012-10-17”, “声明”:[ { “效果”:“允许”, “委托人”:{ “AWS”:“arn:AWS:iam::111122223333:root” }, “操作”:“sts:假定角色” } ] } 我需要获取值.Principal.AWS并将其保存在变量$orig或其他内容中,然后将该变量作为数组中的元素读取,该数组将成为新文档 这几乎奏效了: '.Statement[0] | .Principal.AWS as

我有以下我无法解决的JQ问题。给定JSON:

{
“版本”:“2012-10-17”,
“声明”:[
{
“效果”:“允许”,
“委托人”:{
“AWS”:“arn:AWS:iam::111122223333:root”
},
“操作”:“sts:假定角色”
}
]
}
我需要获取值
.Principal.AWS
并将其保存在变量
$orig
或其他内容中,然后将该变量作为数组中的元素读取,该数组将成为新文档

这几乎奏效了:

'.Statement[0]
    | .Principal.AWS as $orig
    | .Principal.AWS = [$orig] + ["foo", "bar"]'
但是,这样做会丢失版本和语句级别。同时,这样做几乎达到了我的目的:

'(.Statement[] | .Principal.AWS) = ["foo", "bar"]'
所以我希望这也能起作用,但它没有:

'(.Statement[] | .Principal.AWS as $orig | .Principal.AWS) = [$orig, "foo", "bar"]'
然后我得到一个无效的路径表达式错误

如何更正此语法?预期结果是:

{
“版本”:“2012-10-17”,
“声明”:[
{
“效果”:“允许”,
“委托人”:{
“AWS”:[“arn:AWS:iam::111122223333:root”、“foo”、“bar”]
},
“操作”:“sts:假定角色”
}
]
}

您只需在已做好的尝试中添加一个简单的内容即可。将
|
替换为并可选地分组到括号
(..)
|=
之后的零件从
重新创建对象,并指定给LHS上的路径

.Statement[0] |= ( .Principal.AWS as $orig | .Principal.AWS = [$orig] + ["foo", "bar"] )
#            ^^^

您只需要确保不会在顶层使用管道更改输入上下文。赋值保留输入,因此尝试将筛选器作为赋值写入

中间变量是不必要的,您可以不使用它。我会这样写:

.Statement[].Principal.AWS |= [(arrays // [.])[], "foo", "bar"]
如果
Principal.AWS
已经是一个数组,它只会将新值附加到该数组中,否则会假定当前值是新数组的第一项