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