输出包含排序内容的整个JSON文档
是否可以对json文档的特定数组进行排序,并输出整个文档,其中包含排序后的内容,否则将不被触及 例如,如果我有这样的东西:输出包含排序内容的整个JSON文档,json,sorting,jq,jmespath,Json,Sorting,Jq,Jmespath,是否可以对json文档的特定数组进行排序,并输出整个文档,其中包含排序后的内容,否则将不被触及 例如,如果我有这样的东西: { "Version": "2012-10-17", "Statement": [ { "Sid": "BLAHBLAHBLAH", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::346654243625:root",
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BLAHBLAHBLAH",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::346654243625:root",
"arn:aws:iam::984895836564:root",
"arn:aws:iam::636877599363:root",
"arn:aws:iam::577836285792:root",
"arn:aws:iam::836666644595:root",
"arn:aws:iam::652379234777:root",
"arn:aws:iam::339659563489:root",
"arn:aws:iam::293576423935:root",
"arn:aws:iam::682354689262:root",
"arn:aws:iam::349855857558:root",
"arn:aws:iam::398259495958:root",
"arn:aws:iam::735277384553:root"
]
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::blah-blah-blah",
"arn:aws:s3:::blah-blah-blah/*"
]
}
]
}
我想拿回这个:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BLAHBLAHBLAH",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::293576423935:root",
"arn:aws:iam::339659563489:root",
"arn:aws:iam::346654243625:root",
"arn:aws:iam::349855857558:root",
"arn:aws:iam::398259495958:root",
"arn:aws:iam::577836285792:root",
"arn:aws:iam::636877599363:root",
"arn:aws:iam::652379234777:root",
"arn:aws:iam::682354689262:root",
"arn:aws:iam::735277384553:root",
"arn:aws:iam::836666644595:root",
"arn:aws:iam::984895836564:root"
]
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::blah-blah-blah",
"arn:aws:s3:::blah-blah-blah/*"
]
}
]
}
我看到过使用jq
和JMESPath
进行排序的示例,但只看到它们输出被排序的部分,而没有输出带有排序部分的整个文档。正在寻求有关这一问题的指导,并将对任何有效的解决方案感到满意
这就是我用来排序数组
|jq'.Statement[].Principal.AWS | sort'
的方法,它是有效的,但我想回到整个文档的上下文中,它的格式是一样的。对于jq处理器来说,这是一项很好的工作:
jq '.Statement[0].Principal.AWS |= sort' file
-所选项目.Statement[0].Principal.AWS
-更新语句/操作(更新所选项目)|=
输出:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BLAHBLAHBLAH",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::293576423935:root",
"arn:aws:iam::339659563489:root",
"arn:aws:iam::346654243625:root",
"arn:aws:iam::349855857558:root",
"arn:aws:iam::398259495958:root",
"arn:aws:iam::577836285792:root",
"arn:aws:iam::636877599363:root",
"arn:aws:iam::652379234777:root",
"arn:aws:iam::682354689262:root",
"arn:aws:iam::735277384553:root",
"arn:aws:iam::836666644595:root",
"arn:aws:iam::984895836564:root"
]
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::blah-blah-blah",
"arn:aws:s3:::blah-blah-blah/*"
]
}
]
}
要对多个阵列进行排序,请使用:
jq '.Statement[].Principal.AWS |= sort' file
好极了这确实有效,你愿意把它分解并解释它是如何实现的吗?@Trytry再次,当然,请参阅我的解释两条评论:1。您不必将其限制在第一条语句中,您可以将其保留为
.statement[].Principal…
,2。当不需要排序时,初始的
可以是排序
.Statement[].Principal.AWS |=sort
@trytryreach:这里的关键是,因为这里应用的过滤器是一个赋值,所以它不会更改上下文。因此,我们不是将范围缩小到每个语句的单个AWS
属性,然后进行排序,而是选择单个AWS属性并通过排序进行更新。@JeffMercado…很有意义,我总是喜欢额外的解释,喜欢能够删掉任何不必要的内容。确认和高兴:)谢谢