Ошибка выбора jq: «Невозможно проиндексировать строку со строкой <object>» - PullRequest
1 голос
/ 13 апреля 2019

Команда:

cat test.json | jq -r '.[] | select(.input[] | .["$link"] | contains("randomtext1")) | .id'

Я ожидал увидеть обе записи (a и b), поскольку они обе содержат randomtext1

Вместо этого я получил следующее выходное сообщение:

a

jq: error (at <stdin>:22): Cannot index string with string "$link"

Из некоторых копаний я понимаю, что проблема, вероятно, вызвана следующей парой объект / значение в записи a:

"someotherobj": "123"

, поскольку он не содержит объект $link, а фильтр в команде ожидает увидеть $link во всех объектах в input, поэтому он выдает ошибку, прежде чем команда сможет выполнить поиск в b запись.

Что я действительно хочу, так это иметь возможность искать любые записи, у которых есть хотя бы одна пара "$link": "randomtext1" в input. Есть ли функция нечеткого поиска, позволяющая мне этого добиться?

Я пытался использовать два contains, надеясь, что он просто пропустит все:

jq -r '.[] | select(.input[] | contains(["$link"]) | contains("randomtext1")) | .id'

но это совсем не понравилось ..

файл test.json:

[
  {
    "input": {
      "obj1": {
        "$link": "randomtext1"
      },
      "obj2": {
        "$link": "randomtext2"
      },
      "someotherobj": "123"
    },
    "id": "a"
  },
  {
    "input": {
      "obj3": {
        "$link": "randomtext1"
      },
      "obj4": {
        "$link": "randomtext2"
      }
    },
    "id": "b"
  }
]

1 Ответ

0 голосов
/ 13 апреля 2019

Что я действительно хочу, так это чтобы у меня была возможность искать любые записи, у которых есть хотя бы одна пара «$ link»: «randomtext1» во входных данных.

Ключевое слово здесь,и в вопросе, и в следующем ответе это any:

.[]
| select( any(.input[];
              type=="object" and has("$link") and (.["$link"] | index("randomtext1"))))
| .id

Конечно, если вам нужно, чтобы значение ключа было «randomtext1», вы бы написали .["$link"] == "randomtext1".

...