Json sed查找和替换而不是替换值

Json sed查找和替换而不是替换值,json,bash,amazon-web-services,sed,terraform,Json,Bash,Amazon Web Services,Sed,Terraform,我已经输入了一个bash脚本,它应该替换一些terraform文件中的一些值,以便用户可以输入IP地址和访问/密钥。但是我的脚本有以下问题 当变量脚本运行时,sg.tf ip更改不会生效,并且提供程序文件更改以以下方式显示: 如果将值123添加到访问密钥输入,则该值将在文件中显示为 access_key=“123”EnterACCESSKEY” 之所以有*字符,是因为脚本应该能够运行多次,但给出相同的结果,所以只要周围的字符串匹配,它就不必寻找特定的值来替换 variables.sh脚本 #!/

我已经输入了一个bash脚本,它应该替换一些terraform文件中的一些值,以便用户可以输入IP地址和访问/密钥。但是我的脚本有以下问题

当变量脚本运行时,sg.tf ip更改不会生效,并且提供程序文件更改以以下方式显示:

如果将值123添加到访问密钥输入,则该值将在文件中显示为

access_key=“123”EnterACCESSKEY”

之所以有*字符,是因为脚本应该能够运行多次,但给出相同的结果,所以只要周围的字符串匹配,它就不必寻找特定的值来替换

variables.sh脚本

#!/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"
}

在正则表达式中,
*
是前面模式的量词,它本身不是一个通配符。因此,
“*”
表示匹配任何数量的
,后面紧跟着
,并不表示
之间有任何内容

另外,
[
是一个特殊的操作符,用于创建字符集匹配,因此您需要对其进行转义以逐字匹配

您忘记在最后一个
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

在正则表达式中,
*
是前面模式的量词,它本身不是一个通配符。因此,
“*”
表示匹配任何数量的
,后面紧跟着
,并不表示
之间有任何内容

另外,
[
是一个特殊的操作符,用于创建字符集匹配,因此您需要对其进行转义以逐字匹配

您忘记在最后一个
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


您似乎不明白
*
在正则表达式中是如何工作的,您使用它就像使用通配符模式一样。不要为此使用sed。设置可以由Terraform正确传入的变量,并/或依赖AWS凭证链(env vars/凭证文件/etc)相反。我确实尝试了通过terraform输入凭据的方法,但我找不到@ydaetskcordd您阅读的方法?好的,我看了一下,它可以将密钥导出到env变量中,替换sed,谢谢。@ydaetskcoRIt似乎您不明白
*
在正则表达式中是如何工作的,您使用它就像通配符模式。不要为此使用sed。设置可由Terraform正确传入的变量,并/或依赖AWS凭证链(env vars/credentials file/etc)相反。我确实尝试过通过terraform输入凭据,但我找不到@ydaetskcordd you read?好的,我看了一下,它可以将密钥导出到env变量中,替换sed,谢谢。@ydaetskcor只是按照前面评论中的建议,所以我的脚本最终看起来是这样的。确认t他的作品。非常感谢。似乎运行脚本现在替换了所有cidr块,包括出口规则,即使它声明替换了sed命令中的第一个和第三个出现。我想你看不出原因了吗?感谢@Barmar哪些行上有多个cidr块?你可以在开始处放置一个范围,
1,3s/../
means在文件的第1-3行进行替换。@Barmar我知道您是在回答问题,并且没有接触Terraform,但这是一个X Y问题。OP最好理解如何正确地将变量传递到Terraform,而不是使用sed。只需遵循前面评论中的建议,我的脚本最终看起来是这样的。确认了这一点。非常感谢。似乎运行脚本现在替换了所有cidr块,包括出口规则,甚至认为它状态替换了sed命令中的第一个和第三个出现。我想你看不出原因了吗?谢谢@Barmar哪些行上有多个cidr块?你可以将范围设置为开始时,
1,3s/../../
意味着在文件的第1-3行进行替换。@Barmar我知道您正在回答问题,并且没有接触到Terraform,但这是一个X-Y问题。OP最好理解如何正确地将变量传递到Terraform,而不是使用sed。