JQ вывод истины, если элемент существует - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь использовать jq для вывода одного логического значения, если элемент существует в массиве:

jq -e '.differences[] | .afterBlob.path | contains ("sandbox_app") or contains ("sandbox_cicd")'

Вход:

{
    "differences": [
        {
            "beforeBlob": {
                "blobId": "a9033f024bf",
                "path": "test1",
                "mode": "100644"
            },
            "afterBlob": {
                "blobId": "e27f2609943e",
                "path": "test1",
                "mode": "100644"
            },
            "changeType": "M"
        },
        {
            "beforeBlob": {
                "blobId": "ec669676314",
                "path": "test2",
                "mode": "100644"
            },
            "afterBlob": {
                "blobId": "38867b90873",
                "path": "test2",
                "mode": "100644"
            },
            "changeType": "M"
        },
        {
            "afterBlob": {
                "blobId": "ae8c5bdb690",
                "path": "sandbox_app/test3",
                "mode": "100644"
            },
            "changeType": "A"
        },
        {
            "afterBlob": {
                "blobId": "97819f382ad9",
                "path": "sandbox_cicd/test3",
                "mode": "100644"
            },
            "changeType": "A"
        }
    ]
}

Токовый выход:

false
false
true
true

Как сделать так, чтобы вывод был просто логическим значением.

Я попытался использовать функцию 'any':

 jq -e '.differences[] | .afterBlob.path | contains ("sandbox_app") or contains ("sandbox_cicd") | any'

, но получить следующее:

jq: error (at <stdin>:46): Cannot iterate over boolean (false)

Я также попытался обернуть функцию 'any' вокруг моего выражения. Есть ли способ для jq просто вывести один логический, если значение существует

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

any/2 допускает значительно более эффективное решение, чем any/0:

any(.differences[]; 
    .afterBlob.path | contains ("sandbox_app") or contains ("sandbox_cicd") )
0 голосов
/ 22 апреля 2020

Вам нужно обернуть текущее выражение в массив, который затем может быть передан в any:

jq -e '<b>[</b>.differences[].afterBlob.path |
         contains ("sandbox_app") or contains ("sandbox_cicd")<b>] | 
       any</b>' foo.json

Вы также можете написать это, используя map:

jq -e '.differences | 
       map(.afterBlob.path | contains ("sandbox_app") or contains ("sandbox_cicd")) |
       any' foo.json

, что немного длиннее, но вы можете найти его более интуитивным.

...