如何使用jq数组值返回true

问题描述 投票:1回答:3

我正在尝试使用以下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" 

检测到并没有给我一个值列表。

arrays json jq any
3个回答
2
投票

any/2是一个非常有效的解决方案(包括时间和空间)很容易:

any(.Tags[]; .Key == "aws:cloudformation:stack-name")

这当然要评估truefalse。如果你想要true或者什么都不需要,你可以将// empty添加到上面。


0
投票

一个解决方案,它从.tags构建一个boolean数组,并在使用any之后聚合所有的布尔值

jq '.Tags | map( .Key == "aws:cloudformation:stack-name" ) |  any ' 

0
投票

如果您对替代品持开放态度,这里也是一个简单的(基于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的末尾),只需确保插入在成功匹配时启动模板。

© www.soinside.com 2019 - 2024. All rights reserved.