Использование jq для добавления суффикса строки к полю в объекте, не содержащем его - PullRequest
2 голосов
/ 05 августа 2020

У меня json выглядит следующим образом:

{
  "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "batchPools": {
      "value": [
        {
          "networkConfiguration": {
            "subnetId": "/subscriptions/xxxx/resourceGroups/xxx/providers/Microsoft.Network/virtualNetworks/xxxxx/subnets/sample-name-batch",
            "subnetAddressPrefix": ""
          }
        },
        {
          "networkConfiguration": {
            "subnetId": "/subscriptions/xxxx/resourceGroups/xxx/providers/Microsoft.Network/virtualNetworks/xxxxx/subnets/sample-name",
            "subnetAddressPrefix": ""
          }
        }
      ]
    }
  }
}

Мне нужно проверить, не содержит ли какой-либо из networkConfiguration.subnetID в массиве value строку batch. Если да, то ничего делать не нужно. В противном случае добавьте -batch к существующему значению. В этом случае следует обновлять только второй networkConfiguration.subnetID массива.

Я пробовал следующее:

(.parameters.batchPools.value[] | select(.networkConfiguration.subnetId | contains("-batch") | not) | .networkConfiguration.subnetId) |= (.networkConfiguration.subnetId+"-batch")

Я получаю следующую ошибку: jq: error (at <stdin>:38): Cannot index string with string "networkConfiguration" exit status 5

Я пробовал это:

(.parameters.batchPools.value[] | select(.networkConfiguration.subnetId | contains("batch") | not) | .networkConfiguration.subnetId) |= "someValue"

Это сработало нормально и заменило весь subnetId на someValue. Я не могу понять, почему предыдущая команда не работает. Пожалуйста, помогите.

1 Ответ

1 голос
/ 05 августа 2020

Вам не нужно снова использовать весь путь subnetId. Вы уже выбрали этот узел из конвейера раньше. Просто используйте оператор добавления += для добавления суффикса к требуемой строке

( .parameters.batchPools.value[] | 
  select(.networkConfiguration.subnetId | contains("batch") | not) | 
  .networkConfiguration.subnetId ) += "-batch"

jqplay - Онлайн-демонстрация

...