jq - добавить поле в child, напечатать parent - PullRequest
0 голосов
/ 01 марта 2019

Проблема: из файла json прочитайте его с диска, добавьте поле в дочерний объект и распечатайте его обратно на диск.

Файл:

{
  "name": "api",
  "script": "index.js",
  "instances": "1",
  "env": {
    "PORT": 3000
  },
  "env_production": {
    "PORT": 3000
  }
}

Итак, мне удалось передать его и добавить поле:

cat pm2.json | jq --arg key val '. as $parent | .env_production + {"abc": "123"}'

, которое возвращает дочерний объект с добавленным полем.Однако мне нужно обновить файл на диске.Поэтому мне также нужно распечатать весь объект (родитель).

Я могу сделать это, напечатав переменную $parent.Но я не могу заставить его работать, так как он неизменен.

cat pm2.json | jq --arg key val '. as $parent | .env_production + {"abc": "123"}| $parent'

Вопрос: как я могу сделать это, чтобы переменная $parent имела новое добавленное поле, чтобы я мог передать его обратно в исходный файл?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Лучший инструмент для использования здесь - это оператор сложения обновлений, +=

< pm2.json jq '.env_production += {"abc": "123"}'

выведет

{
  "name": "api",
  "script": "index.js",
  "instances": "1",
  "env": {
    "PORT": 3000
  },
  "env_production": {
    "PORT": 3000,
    "abc": "123"
  }
}

Это работает примерно так:

. + {"env_production": (.env_production + {"abc":"123"})}

за исключением, конечно, что это намного проще:)

0 голосов
/ 01 марта 2019

Как насчет использования sponge вместе с jq следующим образом:

jq '.env_production.abc = "123"' pm2.json | sponge pm2.json

Приведенная выше команда добавит ключ abc: "123" к env_production, и результат (полный объект json) будетпередан sponge для обновления файла

sponge является частью moreutils пакета

sponge имеет преимуществоПереадресация через оболочку в соответствии с описанием на страницах руководства:

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

...