jq: Как можно разрезать вложенный объект, чтобы включить иерархию родительского ключа? - PullRequest
0 голосов
/ 20 мая 2018

Используя Bash и jq, если у меня есть фильтр переменных Bash F формы .<key1>.<key2>...<keyN> и я хочу нарезать объект JSON переменной Bash O , чтобы получить результаттолько этот фрагмент объекта, включая все ключи в F , как это можно сделать с помощью jq?

Например, предположим:

O='
{
   "a":
   {
      "b":
      {
         "c": { "p":1 },
         "x": 1
      },
      "x": 2
  },
  "x": 3
}'

Затем выполните:

F='.a.b.c'; jq -r "$F" <<<"$O"

приводит к:

{
   "p": 1
}

Но я хочу, чтобы срез включал иерархию родительских ключей.

Неэффективное решение

Я нашел решение, но оно включает в себя 2 вызова jq:

F='.a.b.c'; S="$(jq -r "$F" <<<"$O"); jq --null-input -r "$F |= $S"

, что приводит к:

{
  "a": {
    "b": {
      "c": {
        "p": 1
      }
    }
  }
}

Решение должно работать для любая допустимая O и F Переменная Bash, где O хранит объект JSON, а F является простымфильтр имен ключей только как описано выше.Например:

F='.a.b'; S="$(jq -r "$F" <<<"$O")"; jq --null-input -r "$F |= $S"

приводит к:

{
  "a": {
    "b": {
      "c": {
        "p": 1
      },
      "x": 1
    }
  }
}

Можно ли проще нарезать объект с помощью фильтра иерархии ключей в jq?

1 Ответ

0 голосов
/ 20 мая 2018

При условии, что $ F является допустимым выражением пути jq (то есть, чтобы jq -n "$F" работало):

jq "$F as \$v | null | $F |= \$v" <<< "$O"

(я включил | = из вашего решения, чтобы показать сходство, но здесь вы можетебросьте |.)

...