首页 > 解决方案 > 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 以及两者的spoke1spoke2

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"
    }
  }
}

标签: bashunixsedterraform

解决方案


使用 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"
   }

 }
}

推荐阅读