Как найти что-то в файле json с помощью Bash - PullRequest
2 голосов
/ 27 мая 2020

Я хотел бы найти в файле JSON какой-либо ключ или значение и распечатать его там, где он был найден.

Например, при использовании jq для распечатки моих расширений Firefox '. json, я получаю что-то вроде этого (используя "..." здесь, чтобы пропустить длинные части):

{
  "schemaVersion": 31,
  "addons": [
    {
      "id": "wetransfer@extensions.thunderbird.net",
      "syncGUID": "{e6369308-1efc-40fd-aa5f-38da7b20df9b}",
      "version": "2.0.0",
      ...
    },
    {
      ...
    }
  ]
}

Скажем, я хотел бы найти «wetransfer@extensions.thunderbird.net» и хотел бы получить вывод, который показывает мне, где он был найден, примерно так:

{ "addons": [ {"id": "wetransfer@extensions.thunderbird.net"} ] }

Есть ли способ получить это с помощью jq или другого инструмента json?

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

Другими словами, я ищу синтаксический анализатор json командной строки, который я мог бы использовать аналогично инструментам Xpath

Ответы [ 2 ]

3 голосов
/ 28 мая 2020

Функция path() пригодится:

$ jq -c 'path(.. | select(. == "wetransfer@extensions.thunderbird.net"))' input.json
["addons",0,"id"]

Результирующий путь интерпретируется как «В поле addons исходного объекта совпадает поле id первого элемента массива». Вы можете использовать его с getpath(), setpath(), delpaths(), et c. для получения или изменения описываемого значения.

2 голосов
/ 28 мая 2020

Используя ваш пример с изменениями, чтобы сделать его действительным JSON:

< input.json jq -c --arg s wetransfer@extensions.thunderbird.net '
  paths as $p | select(getpath($p) == $s) | null | setpath($p;$s)'

дает:

{"addons":[{"id":"wetransfer@extensions.thunderbird.net"}]}

Примечание

Если есть N путей к с заданным значением, приведенное выше приведет к созданию N строк. Если вам нужен только первый, вы можете обернуть все в first(...).

Список всех "id" значений

Я также попытался просто перечислить различные идентификаторы в этом файле

Предполагая, что "id" значения false и null не представляют интереса, вы можете распечатать все интересующие значения id, используя фильтр jq:

.. | .id? // empty
...