bash - sed:尝试替换字符串时替换表达式中的错误选项
问题描述
tr 文件并尝试更改其中的数据并获取此替换错误。
我的文件数据是
variable "aws_spoke_gateways" {
default = {
spoke1 = {
name = "AWS-UE2-Spoke1-GW"
},
spoke2 = {
name = "AWS-UE2-Spoke1-GW"
}
}
}
我想要的输出是
variable "aws_spoke_gateways" {
default = {
spoke1 = {
name = "myname"
},
spoke2 = {
name = "AWS-UE2-Spoke1-GW"
}
}
}
编辑 1
我想更改 name 、 size 和 vpc 以及两者的spoke1
值spoke2
variable "aws_spoke_gateways" {
default = {
spoke1 = {
name = "AZ-EU-Spoke1-GW"
size = "Standard_B1ms"
active_mesh = true
single_az_ha = true
vpc = "azure_spoke2_vnet"
},
spoke2 = {
name = "AZ-EU-Spoke2-GW"
size = "Standard_B1ms"
active_mesh = true
single_az_ha = true
vpc = "azure_spoke2_vnet"
}
}
}
解决方案
使用 sed -z 将文件作为一行使用,因此:
sed -Ezi 's/(^.*spoke1 = .*= ")(.*)(".*\},.*$)/\1myname\3/' file
使用 -E 启用扩展正则表达式。根据正则表达式将文件拆分为 3 个部分。打印第一部分,然后是更改后的名称(在本例中为 myname),然后是第三部分。
OP进一步评论后修改的解决方案:
原始数据:
variable "aws_spoke_gateways" {
default = {
spoke1 = {
name = "AWS-UE2-Spoke1-GW"
},
spoke2 = {
name = "AWS-UE2-Spoke2-GW"
},
spoke3 = {
name = "AWS-UE2-Spoke3-GW"
},
spoke4 = {
name = "AWS-UE2-Spoke4-GW"
}
}
}
spoke1="test1"
spoke2="test2"
spoke3="test3"
spoke4="test4"
sed -Ez "s/(^.*spoke1 = .*= \")(.*)(\".*\},.*spoke2.*$)/\1$spoke1\3/;s/(^.*spoke2 = .*= \")(.*)(\".*\},.*spoke3.*$)/\1$spoke2\3/;s/(^.*spoke3 = .*= \")(.*)(\".*\},.*$)/\1$spoke3\3/;s/(^.*spoke4 = .*= \")(.*)(\".*\}.*$)/\1$spoke4\3/" file
结果:
variable "aws_spoke_gateways" {
default = {
spoke1 = {
name = "test1"
},
spoke2 = {
name = "test2"
},
spoke3 = {
name = "test3"
},
spoke4 = {
name = "test4"
}
}
}
推荐阅读
- jpa - jpql @query case when
- bash - 使用两个分隔符中的任何一个终止读取(即 read -d '.' -> read -d '[Ee]')
- java - java - 如何从Java应用程序中的SQlite中具有不同百分比机会的两个表中获取随机idrow?
- java - 创建共享数据库 Java DB
- javascript - 如何修复Revolution-slider中卡住的javascript计数器
- java - Why am I must use findViewById command inside methods?
- xamarin.forms - 在 Xamarin 表单中旋转地图
- java - How to set tokenizer options when using the simple CoreNLP API?
- javascript - how can i solve ESLint error that 'no-unused-var' with google map
- git - 执行 git checkout -f 时查找标签名称