невозможно заменить все пустым между двумя символами - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь извлечь часть "имени стека" из строки AWS ARN. Строка выглядит следующим образом:

arn:aws:cloudformation:ap-southeast-2:111111111111:stack/infrastructure-dev/aaaaaaaa-f005-11e9-9e45-02bf7f1fc1f4

Проблема не столько в извлечении, сколько в замене исходного ключа измененным исходным значением, используя jq.

. Мое утверждение таково::

aws cloudformation list-exports --no-paginate | jq -r '.Exports |= map(if .ExportingStackId != "" then .ExportingStackId |= sub("(?<=\/)(.*?)(?=\/)"; "") else . end)'

Команда sub("(?<=\/)(.*?)(?=\/)"; "") будет соответствовать, но она заменит часть строки пустой.

{
  "Exports": [
    {
      "ExportingStackId": "arn:aws:cloudformation:ap-southeast-2:111111111111:stack//aaaaaaaa-f005-11e9-bbbb-aaaaaaaa",
      "Name": "BootstrapRoleArn",
      "Value": "arn:aws:iam::111111111111:role/deployment-role"
    },
    {
      "ExportingStackId": "arn:aws:cloudformation:ap-southeast-2:111111111111:stack//aaaaaaaa-f005-11e9-bbbb-aaaaaaaa",
      "Name": "PrivateSubnetAId",
      "Value": "subnet-44444444444"
    },
    ...
    ...
    ...
  ]
}

Мне нужно обратное этому, при котором все остальное, окружающее этот портон строки, устанавливается пустым

{
  "Exports": [
    {
      "ExportingStackId": "infrastructure-dev",
      "Name": "BootstrapRoleArn",
      "Value": "arn:aws:iam::111111111111:role/deployment-role"
    },
    {
      "ExportingStackId": "infrastructure-prod",
      "Name": "PrivateSubnetAId",
      "Value": "subnet-44444444444"
    },
    ...
    ...
    ...
  ]
}

В качестве «дополнительного вызова» я действительно хотел быбыть в состоянии удалить добавленную часть «-dev» или «-prod», так что результат будет:

{
  "Exports": [
    {
      "ExportingStackId": "infrastructure",
      "Name": "BootstrapRoleArn",
      "Value": "arn:aws:iam::111111111111:role/deployment-role"
    },
    {
      "ExportingStackId": "infrastructure",
      "Name": "PrivateSubnetAId",
      "Value": "subnet-44444444444"
    },
    ...
    ...
    ...
  ]
}

1 Ответ

3 голосов
/ 17 октября 2019

Вместо использования sub рассмотрите возможность использования capture, например:

(capture(".*(?<x>(?<=\/)(.*?)(?=\/)).*"; "") | .x)

Требования относительно удаления суффикса -dev или -prod не очень ясны, но вы можете просто подуматьиспользуя sub("-(dev|prod)$"; ""), так что вы получите:

.Exports
  |= map(if .ExportingStackId != ""
     then .ExportingStackId 
            |= (capture(".*(?<x>(?<=\/)(.*?)(?=\/)).*"; "")
                | .x 
                | gsub("-(dev|prod)$"; ""))
     else . end)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...