Динамически добавлять пару ключ-значение в объект jSON с помощью оболочки - PullRequest
0 голосов
/ 24 октября 2018

У меня есть объект json с именем version6json следующим образом

{
  "20007.098": {
    "os_version": "6.9",
    "kernel": "2.6.32-696",
    "sfdc-release": "2017.08"
  },
  "200907.09678”: {
    "os_version": "6.9",
    "kernel": "2.6.32-696",
    "sfdc-release": "201.7909"
  },
  "206727.1078”: {
    "os_version": "6.9",
    "kernel": "2.6.32-696.10.2.el6.x86_64",
    "sfdc-release": "20097.109”
  }
}

Я хочу добавить еще одну пару ключ-значение.Ключ также является переменной и значением тоже.bundle_release = "2019.78" и value = {"release": "2018.1006", "kernel": "2.6.32-754.3.5.el6.x86_64", "os": "6.10", "current": true} сейчасЯ хочу, чтобы bundle_release в качестве ключа и значение в качестве его значения, поэтому новая запись будет "2018.1006": {"release": "2018.1006", "kernel": "2.6.32-754.3.5.el6.x86_64", "os ":" 6.10 "," current ": true}

Чтобы добиться этого, я делаю следующее

echo "$version6json" | jq --arg "$bundle_release" "$value" '. + {$bundle_release: "${value}"}'

Любая помощь будет оценена.

PS- Вопрос отредактирован в соответствии с предложением пика

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Вы не даете опции --arg достаточно параметров: из руководства:

--arg name value:

Эта опция передает значение в jqзапрограммировать как предопределенную переменную.Если вы запускаете jq с --arg foo bar, то $foo доступно в программе и имеет значение "bar".Обратите внимание, что значение будет считаться строкой, поэтому --arg foo 123 будет связывать $foo с "123".

0 голосов
/ 24 октября 2018

Во-первых, при указании имени ключа, используя переменную, как вы делаете, переменная должна быть заключена в скобки, поэтому вы должны иметь:

 {($bundle_release): ...}

Далее, переменные jq не совпадают с shellпеременные и должны быть указаны без кавычек и без использования bash-isms.

В-третьих, при установке значения переменной оболочки с именем value вам необходимо будет соответствующим образом заключить выражение в кавычки.

В-четвертых, для упрощения используйте --argjson для $value.

В-пятых, ваш пример JSON не совсем верен.После исправления следующее будет работать в среде bash или bash-like (при условии, что вы используете версию jq, поддерживающую --argjson):

bundle_release="1034,567"
value='{"release":"2018.1006","kernel":"2.6.32-754.3.5.el6.x86_64","os":"6.10","current":true}'

jq --arg b "$bundle_release" --argjson v "$value"  '
  . + {($b): $v}' <<< "$version6json"
...