我正在尝试使用以下jq命令返回真正的输出,如果列表中的任何一个条件为真。
.Tags[] as $t| "aws:cloudformation:stack-name"| IN($t[])
输入
{
"Tags": [{
"Value": "INF-D-XX-SEC-OPNV-UW1",
"Key": "Name"
},
{
"Value": "INF-D-XX-CFS-StandardInfrastructure-UW1",
"Key": "aws:cloudformation:stack-name"
},
{
"Value": "sgOpenVPNAccess",
"Key": "aws:cloudformation:logical-id"
},
{
"Value": "UW1",
"Key": "Location"
},
{
"Value": "INF",
"Key": "Application"
},
{
"Value": "D",
"Key": "Parent Environment"
},
{
"Value": "arn:aws:cloudformation:us-west-1:111111:stack/INF-D-XX-CFS-StandardInfrastructure-UW1/1111-11-11e8-96fe-11",
"Key": "aws:cloudformation:stack-id"
},
{
"Value": "OPNV",
"Key": "ResourceType"
}
]
}
这给了我一个返回的布尔值列表,如下所示,
--output--
true
false
false
false
false
false
false
我想返回单个值true
,如果其中之一
Key="aws:cloudformation:stack-name"
检测到并没有给我一个值列表。
any/2
是一个非常有效的解决方案(包括时间和空间)很容易:
any(.Tags[]; .Key == "aws:cloudformation:stack-name")
这当然要评估true
或false
。如果你想要true
或者什么都不需要,你可以将// empty
添加到上面。
一个解决方案,它从.tags构建一个boolean数组,并在使用any之后聚合所有的布尔值
jq '.Tags | map( .Key == "aws:cloudformation:stack-name" ) | any '
如果您对替代品持开放态度,这里也是一个简单的(基于unix实用程序jtc
):
bash $ <file.json jtc -w'[Key]:<^aws:cloudformation:stack-name$()>R' -T'true{$1}'
true
bash $ <file.json jtc -w'[Key]:<^blah$()>R' -T'true{$1}'
bash $
一个小技巧是:执行RE匹配,同时使用假/空组(在RE的末尾),只需确保插入在成功匹配时启动模板。