Обновите значения в json (элементы массива), используя цикл jq - PullRequest
0 голосов
/ 16 января 2020

У меня есть входной файл json с массивом. Мне нужно обновить два значения (ver & date) в каждом элементе массива. Я мог бы придумать сценарий ниже, но нужна помощь. Я жестко запрограммировал ver & date, чтобы упростить сценарий.

input. json

[
  {
    "svcname": "svc1",
    "repo": "https://repo.mycom.org/repocontext/svc1-list",
    "ver": "0.1",
    "date": "2019-11-05"
  },
  {
    "svcname": "svc1",
    "repo": "https://repo.mycom.org/repocontext/svc1-list",
    "ver": "0.1",
    "date": "2019-12-21"
  }
]

Script:

#!/bin/bash
set +x
injson=input.json
updatedjson=$(jq .[] ${injson})

services=$(cat ${injson} | jq '.[] | .svcname' | tr -d \")
i=1
for svc in $services; do 

        echo "==>$svc"
        echo "======> input json=${updatedjson}"
        echo "======> update ver=${i}"
        updatedjson=$(echo ${updatedjson} | jq ". | select( .name ==\"$svc\").ver=\"$i\"" | jq . )
        svcdate="2020-01-$i"
        echo "======> update date=$svcdate"
        updatedjson=$(echo ${updatedjson} | jq ". | select( .name ==\"$svc\").date=\"$svcdate\"" | jq . )
        echo "============================================"
        echo
        i=`expr $i + 1`

done

echo "======= write to file ====="
echo ${updatedjson}
echo ${updatedjson} | jq . > outjson.json

1 Ответ

1 голос
/ 16 января 2020

Вы не используете истинные функции jq. То, что вы показали в al oop, итерируя по всем объектам JSON, можно просто уменьшить до одной конструкции reduce(), которая является своего рода for l oop в jq при заданном начальном значении и запускает пошаговый фильтр

jq 'reduce range(0, length) as $d (.; (.[$d].ver = ($d+1|tostring)) | (.[$d].date = "2020-01-\($d+1)")) '

Краткое объяснение того, как это работает

  1. Выражение диапазона возвращает список с числами, сгенерированными от 0 до длины объектов в массиве. Для заданного вами ввода он выдает 0,1, который присваивается d
  2. Выражение reduce с учетом входного значения . всего JSON, выполняется путем установки значений в каждом объекте, проиндексированном с помощью $d. Таким образом, .[$d].ver относится к полю ver в нулевом индексе. Это делается постепенно до тех пор, пока все объекты не будут обработаны.
  3. Таким же образом поле даты изменяется, используя [$d].date с префиксом строки значения (ГГГГ-ММ-) и датой, соответственно устанавливаемой.
...