JQ - как вставить в середине объекта массива через JQ - PullRequest
0 голосов
/ 11 января 2019

Можете ли вы намекнуть, как вставить новый элемент в середину объекта массива через jq ..

1.json файл: -

[ {
    "name": "Dependencies",
    "asyncInstallation": false,
    "failOnError": true,
    "yamls": [
      "dependency.yaml",
          ]
  },
  {
    "name": "Management Configuration",
    "asyncInstallation": false,
    "failOnError": true,
    "yamls": [
      "mgmt-job.yaml"
    ]
  },
  {
    "name": "Data Configuration",
    "asyncInstallation": false,
    "failOnError": true,
    "yamls": [
      "data-job.yaml"
    ]
  }, 
  {
    "name": "Tools",
    "asyncInstallation": true,
    "failOnError": false,
    "yamls": [
      "tools-job.yaml"
    ]
  }
]

Я хотел бы вставить следующий текст «Конфигурация управления».

 {
    "name": "NEW Configuration",
    "asyncInstallation": false,
    "failOnError": true,
    "yamls": [
      "newfile.yaml"
    ]
  }, 

Подскажите, пожалуйста, как мы можем это сделать, используя jq или sed?

спасибо Saravanan

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Вы можете использовать map/1 для выполнения вставки. В сопоставлении вы можете проверить, находитесь ли вы в данный момент на узле, который хотите вставить после, и вывести его, а также новый узел, который хотите вставить, в противном случае не вносите никаких дальнейших изменений.

$ jq --argjson i '...' 'map(if .name == "Management Configuration" then ., $i else . end)'
0 голосов
/ 11 января 2019

Во-первых, давайте предположим, что мы знали, что индекс объекта с именем «Конфигурация управления» был $ i. Тогда, предполагая, что объект для вставки равен $ o, мы бы написали:

.[0:$i+1] + [$o] + .[$i+1:]

Таким образом, задача сводится к поиску $ i, что можно эффективно сделать следующим образом:

first(range(0;length) as $i
      | select(.[$i].name=="Management Configuration")
      | $i)

Заботясь о том, чтобы мы обрабатывали вероятность того, что объект, которого мы ожидаем встретить в массиве, нет, мы можем собрать кусочки следующим образом:

(first(range(0;length) as $i
 | select(.[$i].name=="Management Configuration")
 | $i) // null) as $i
| if $i then .[0:$i+1] + [$o] + .[$i+1:] else . end

Один из способов установить $o будет в командной строке, например, вдоль линий:

jq --argjson o '....' -f insert.jq 1.json

IndexOf

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

def indexof(f):
  first(range(0;length) as $i
        | select(.[$i]|f) | $i) // null;

Решение тогда становится:

indexof(.name=="Management Configuration") as $i
| if $i then .[0:$i+1] + [$o] + .[$i+1:] else . end
...