sed находит и заменяет не заменяющие значения - PullRequest
0 голосов
/ 12 марта 2020

Я ввел скрипт bash, который должен заменить некоторые значения в некоторых файлах terraform, чтобы пользователь мог ввести IP-адрес и секретные ключи доступа. Но мой сценарий имеет следующие проблемы.

При запуске сценария переменных изменения ip sg.tf не вступают в силу, а изменения файла провайдера отображаются следующим образом:

, если значение 123 добавлено в доступ при вводе с клавиатуры он будет отображаться в файле как

access_key = "123" EnterACCESSKEY "

Причина в том, что существует символ *, заключается в том, что идея заключается в том, что скрипт должен запускаться несколько раз, но дает те же результаты, поэтому не нужно искать значение спецификаций c для замены, если совпадает окружающая строка.

переменные. sh script

#!/bin/bash
read -p "Enter Public IP without CIDR notation " IP
sed -i "s/cidr_blocks = [*]/cidr_blocks = [\"$IP\/32\"]/1" sg.tf
sed -i "s/cidr_blocks = [*]/cidr_blocks = [\"$IP\/32\"]/3" sg.tf

read -p "Enter AWS ACCESS KEY: " ACCESSKEY
sed -i "s/access_key = \"*\"/access_key = \"$ACCESSKEY\"/g" providers.tf

read -p "Enter AWS SECRET KEY: " SECRETKEY
sed -i "s/secret_key = "*"/secret_key = "$SECRETKEY"/g" providers.tf

Содержание sg.tf

   ingress {
        from_port = 22
        to_port = 22
        protocol = "TCP"
        cidr_blocks = ["EnterIP/32"]
        }
egress {
        from_port       = 0
        to_port         = 0
        protocol        = "-1"
        description = "Allow all ports outgoing"
        cidr_blocks     = ["0.0.0.0/0"]
        }
ingress {
        from_port = 80
        to_port = 80
        protocol = "TCP"
        cidr_blocks = ["EnterIP/32"]
        }
egress {
        from_port       = 0
        to_port         = 0
        protocol        = "-1"
        description = "Allow all ports outgoing"
        cidr_blocks     = ["0.0.0.0/0"]
        }
}

файл провайдера

provider "aws" {
  access_key = "EnterACCESSKEY"
  secret_key = "EnterSECRETKEY"
  region = "eu-west-1"
}

1 Ответ

2 голосов
/ 12 марта 2020

В регулярном выражении * является квантификатором для шаблона перед ним, он не является подстановочным знаком сам по себе. Таким образом, "*" означает совпадение с любым числом ", за которым сразу следует ", это не означает " и " с чем-либо между ними.

Также [ - это специальный оператор, используемый для создания соответствия набора символов, поэтому вам нужно экранировать его, чтобы буквально соответствовать ему.

Вы забыли экранировать кавычки в последней команде sed.

#!/bin/bash
read -p "Enter Public IP without CIDR notation " IP
sed -i "s/cidr_blocks = \[.*\]/cidr_blocks = [\"$IP\/32\"]/1" sg.tf
sed -i "s/cidr_blocks = \[.*\]/cidr_blocks = [\"$IP\/32\"]/3" sg.tf

read -p "Enter AWS ACCESS KEY: " ACCESSKEY
sed -i "s/access_key = \".*\"/access_key = \"$ACCESSKEY\"/g" providers.tf

read -p "Enter AWS SECRET KEY: " SECRETKEY
sed -i "s/secret_key = \".*\"/secret_key = \"$SECRETKEY\"/g" providers.tf
...