使用变量编辑嵌套数组中的值
Editing value in nested array using variables
我有以下无法解决的JQ问题。给定 JSON:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:root"
},
"Action": "sts:AssumeRole"
}
]
}
我需要获取值 .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"]'
然后我得到一个无效的路径表达式错误。
如何更正此语法?预期结果是:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": ["arn:aws:iam::111122223333:root", "foo", "bar"]
},
"Action": "sts:AssumeRole"
}
]
}
您只需要对已经做得很好的尝试进行简单的添加即可。将 |
替换为 update assignment 并可选择分组到括号 (..)
中。 |=
之后的部分从 .
重新创建对象并分配给 LHS
上的路径
.Statement[0] |= ( .Principal.AWS as $orig | .Principal.AWS = [$orig] + ["foo", "bar"] )
# ^^^
您只需要确保您不会在顶层使用管道更改输入上下文。赋值会保留输入,因此请尝试将过滤器编写为赋值。
中间变量是不必要的,你可以没有它。我会这样写:
.Statement[].Principal.AWS |= [(arrays // [.])[], "foo", "bar"]
如果 Principal.AWS
已经是一个数组,它只会将您的新值附加到该数组,否则假定当前值是新数组的第一项。
我有以下无法解决的JQ问题。给定 JSON:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:root"
},
"Action": "sts:AssumeRole"
}
]
}
我需要获取值 .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"]'
然后我得到一个无效的路径表达式错误。
如何更正此语法?预期结果是:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": ["arn:aws:iam::111122223333:root", "foo", "bar"]
},
"Action": "sts:AssumeRole"
}
]
}
您只需要对已经做得很好的尝试进行简单的添加即可。将 |
替换为 update assignment 并可选择分组到括号 (..)
中。 |=
之后的部分从 .
重新创建对象并分配给 LHS
.Statement[0] |= ( .Principal.AWS as $orig | .Principal.AWS = [$orig] + ["foo", "bar"] )
# ^^^
您只需要确保您不会在顶层使用管道更改输入上下文。赋值会保留输入,因此请尝试将过滤器编写为赋值。
中间变量是不必要的,你可以没有它。我会这样写:
.Statement[].Principal.AWS |= [(arrays // [.])[], "foo", "bar"]
如果 Principal.AWS
已经是一个数组,它只会将您的新值附加到该数组,否则假定当前值是新数组的第一项。