【发布时间】:2018-04-03 12:12:08
【问题描述】:
示例 JSON 输入:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowFullAccess",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::XXXX:user/test",
"arn:aws:iam::XXXX:root"
]
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::test-dev-cognito-settings-us-west-2/*"
],
"Condition": {
"StringNotLike": {
"aws:userId": [
"AZASDASDSADA"
]
}
}
}
]
}
预期的 JSON 输出:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowFullAccess",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::XXXX:user/test",
"arn:aws:iam::XXXX:root"
]
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::test-dev-cognito-settings-us-west-2/*"
],
"Condition": {
"StringNotLike": {
"aws:userId": [
"AZALEA",
"Hello"
]
}
}
},
{
"Sid": "AllowForSpecificLambda_jdtest",
"Effect": "Allow",
"Principal": {
"AWS": "AROAIBA5TVJCIN3OCE2YI"
},
"Action": "s3:Get*",
"Resource": [
"arn:aws:s3:::oppscience-dev-cognito-settings-us-west-2",
"arn:aws:s3:::oppscience-dev-cognito-settings-us-west-2/*"
],
"Condition": {
"StringNotLike": {
"aws:userId": [
"AZA"
]
}
}
]
}
对不起,我在 json 标签中犯了一些语法错误。 我想要的只是在我想要添加新对象+修改现有对象的语句数组对象中。 我正在使用jq 添加新的 JSON 对象。下面是我的代码 sn-p 工作正常。
jq '.Statement[.Statement| length] |= . + {
"Sid": "AllowForSpecificLambda",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::XXXXXXXXXX:role/lambda_allow_pretoken_generation"
]
},
"Action": "s3:Get*","Resource": [
"arn:aws:s3:::test-XXXX-cognito-settings-'$region'"
]}' test.json > test-1.json
我正在使用下面的代码 sn-p 在我的 JSON 数组中添加新值。
jq '.Statement[]
| select(.Sid == "Test")
.Condition.StringNotLike."aws:userId"[.Condition.StringNotLike."aws:userId"| length]
|= . + "Hello"' test.json
如何在单个命令中完成这两件事?
谢谢
【问题讨论】:
-
最好把初始json数据和最终预期结果贴出来
-
当你想要
do this two things in single command并且你使用的命令是jq时,为什么要用sed标记它? -
给定的期望输出中没有任何带有“Test”或“Hello”的内容,因此不清楚“新值”应该去哪里。
-
@peak 我已经添加了应附加在输出中的所需“Hello”。谢谢!