jq - заменить некоторые переменные в массиве - PullRequest
0 голосов
/ 30 октября 2018

Этот вопрос вызван из-за кочевого поведения

У меня есть такой json:

# cat test.json 
{
  "Name": "test",
  "TaskGroups": [
    {
      "Name": "test1",
      "Count": 1
    },
    {
      "Name": "test2",
      "Count": 1
    },
    {
      "Name": "test3",
      "Count": 1
    },
    {
      "Name": "test4",
      "Count": 1
    },
    {
      "Name": "test5",
      "Count": 1
    }
  ]
}

Мне нужно изменить это так: 1) добавь "Job" перед моим json - я могу сделать это с

# cat test.json | jq '{"Job": .}'

2) заменить переменную «Count» для нескольких элементов в массиве, например test1 и test5, я могу сделать это так:

# cat test.json | jq ' .TaskGroups[0,4].Count = 0 '

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

# cat test.json | jq ' .TaskGroups[0,4].Count = 0 | {"Job": .} '

Но я также хочу искать переменные, которые я хочу изменить, по их именам, а не по их количеству в массиве. Так что я могу сделать что-то вроде этого:

cat test.json | jq ' .TaskGroups[] | select(.Name == ("test1", "test5")).Count = 0 '

Но из-за того, что я перечисляю массив, а не весь json - я теряю некоторые переменные и "Job:", которые я только что добавил. Или я могу добавить его к каждому элементу в моем массиве. Так как же я могу изменить переменную по ее имени и одновременно добавить «Job:»?

1 Ответ

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

Вы можете использовать |= оператор «update-assignment» со следующим синтаксисом:

(.TaskGroups[] | select(.Name == ("test1", "test5")).Count) |= 0 | {Job : . }

Это задокументировано здесь .

Мне удалось успешно протестировать его на jqplay: https://jqplay.org/s/578mkUAklU

...