Заменить \ r из json в оболочке - PullRequest
0 голосов
/ 29 мая 2020

У меня ниже JSON в имени переменной TASK_DEFINTIION Он имеет символ \ r в конце "image": "700707367057.dkr.ecr.us-east-1.amazonaws.com/php-demo:feature-feature01\r" под containerDefinitions

Я использую TASK_DEFINITION_AFTER= 'echo $TASK_DEFINTIION | sed "s/\\r//g"', чтобы удалить \ r , но, похоже, он удаляет весь скрытый возврат каретки, но не удаляет тот, который отображается как обычный символ.

Любая помощь будет очень приветствоваться.

{
      "memory": "1024",
      "networkMode": "awsvpc",
      "family": "ecs-php-demo",
      "placementConstraints": [],
      "cpu": "512",
      "executionRoleArn": "arn:aws:iam::700707367057:role/ecsTaskExecutionRole",
      "volumes": [],
      "requiresCompatibilities": [
        "FARGATE"
      ],
      "taskRoleArn": "arn:aws:iam::700707367057:role/ecsTaskExecutionRole",
      "containerDefinitions": [
        {
          "memoryReservation": 256,
          "environment": [],
          "name": "ecs-php-demo",
          "mountPoints": [],
          "image": "700707367057.dkr.ecr.us-east-1.amazonaws.com/php-demo:feature-feature01\r",
          "cpu": 0,
          "portMappings": [
            {
              "protocol": "tcp",
              "containerPort": 8080,
              "hostPort": 8080
            }
          ],
          "logConfiguration": {
            "logDriver": "awslogs",
            "options": {
              "awslogs-region": "us-east-1",
              "awslogs-stream-prefix": "ecs",
              "awslogs-group": "/ecs/ecs-php-demo"
            }
          },
          "essential": true,
          "volumesFrom": []
        }
      ]
    }

Ответы [ 3 ]

2 голосов
/ 29 мая 2020

Использование jq rtrimstr для соответствия синтаксису JSON:

#!/usr/bin/bash

TASK_DEFINTIION="$(
  jq '.containerDefinitions[].image|=rtrimstr("\r")' <<<"$TASK_DEFINTIION"
)"

echo "$TASK_DEFINTIION"

man jq:

rtrimstr(str) Выводит свой ввод с удаленной данной строкой суффикса, если она ей заканчивается.

      jq ´[.[]|rtrimstr("foo")]´
         ["fo", "foo", "barfoo", "foobar", "foob"]
      => ["fo","","bar","foobar","foob"]
1 голос
/ 29 мая 2020

вы можете использовать jq для замены значения ключа:

jq '.containerDefinitions[].image="700707367057.dkr.ecr.us-east-1.amazonaws.com/php-demo:feature-feature01"' file.json

но, к сожалению, jq не поддерживает редактирование на месте, поэтому вы должны сначала перенаправить на временный файл, а затем заменить свой исходный файл с ним или используйте sponge утилиту из пакета more utils, например:

jq '.containerDefinitions[].image="700707367057.dkr.ecr.us-east-1.amazonaws.com/php-demo:feature-feature01"' file.json|sponge file.json

Чистое jq решение для удаления \r с gsub:

jq '.containerDefinitions[].image|=gsub("[\r]"; "")' file.json|sponge file.json

образец вывода:

{
  "memory": "1024",
  "networkMode": "awsvpc",
  "family": "ecs-php-demo",
  "placementConstraints": [],
  "cpu": "512",
  "executionRoleArn": "arn:aws:iam::700707367057:role/ecsTaskExecutionRole",
  "volumes": [],
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "taskRoleArn": "arn:aws:iam::700707367057:role/ecsTaskExecutionRole",
  "containerDefinitions": [
    {
      "memoryReservation": 256,
      "environment": [],
      "name": "ecs-php-demo",
      "mountPoints": [],
      "image": "700707367057.dkr.ecr.us-east-1.amazonaws.com/php-demo:feature-feature01",
      "cpu": 0,
      "portMappings": [
        {
          "protocol": "tcp",
          "containerPort": 8080,
          "hostPort": 8080
        }
      ],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-region": "us-east-1",
          "awslogs-stream-prefix": "ecs",
          "awslogs-group": "/ecs/ecs-php-demo"
        }
      },
      "essential": true,
      "volumesFrom": []
    }
  ]
}
1 голос
/ 29 мая 2020

В вашей команде первое \ экранирует второе \, поэтому sed видит только один \

Вам нужно:

TASK_DEFINITION_AFTER="$(echo $TASK_DEFINTIION | sed "s/\\\\r//g")"
...