Замена значений в JSON на JQ и регулярное выражение - PullRequest
0 голосов
/ 07 марта 2019

У меня есть следующий JSON, где я хочу изменить «тег» строк «изображения».

{
  "taskDefinition": {
    "containerDefinitions": [
      {
        "name": "php",
        "image": "xxxxxx.dkr.ecr.eu-west-1.amazonaws.com/repo/php:latest",
        "cpu": 0,
        "memory": 512,
      },
      {
        "name": "nginx",
        "image": "xxxxxx.dkr.ecr.eu-west-1.amazonaws.com/repo/nginx:latest",
        "cpu": 0,
        "memory": 256,
      }
    ],
    "family": "service-be",
  }
}

Должно стать:

{
  "taskDefinition": {
    "containerDefinitions": [
      {
        "name": "php",
        "image": "xxxxxx.dkr.ecr.eu-west-1.amazonaws.com/repo/php:new",
        "cpu": 0,
        "memory": 512,
      },
      {
        "name": "nginx",
        "image": "xxxxxx.dkr.ecr.eu-west-1.amazonaws.com/repo/nginx:new",
        "cpu": 0,
        "memory": 256,
      }
    ],
    "family": "service-be",
  }
}

Конечно, "последним" может быть что угодно.

До сих пор я нашел следующую подпрограмму regex для изменения строк.

'.taskDefinition.containerDefinitions[].image | sub("(?<repo>.*:).*";  \(.repo)new")'

Но я хочу отредактировать их на месте и сохранить весь JSON. До сих пор мои попытки изменить значение были безуспешными. Я могу изменить значение изображения на строку исправления, но не на замененное исходное значение.

Я пробовал несколько вариантов этого:

'.taskDefinition.containerDefinitions[].image |= . | sub("(?<repo>.*:).*"; "\(.repo)new")'

Кажется, что версия, которую я могу просто использовать (в конвейерах Bitbucket), не имеет функции прогулки, поэтому я бы ее избегал.

1 Ответ

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

О, только что нашел его после нескольких попыток

'.taskDefinition.containerDefinitions[].image |= sub("(?<repo>.*:).*"; "\(.repo)new")'
...