在 Terraform 0.12 中,如何从 1.1.1.1/32 这样的字符串中删除 IP 前缀?

red*_*888 -1 terraform

我得到这个变量:

variable "ip" {
  default = "1.1.1.1/32"
}
Run Code Online (Sandbox Code Playgroud)

在某些情况下,我需要完整的前缀:"1.1.1.1/32"但有时我只需要不带前缀的 IP:"1.1.1.1"

现在 0.12 有这个新函数,我可以这样使用:

trimsuffix(var.ip, "/32")
Run Code Online (Sandbox Code Playgroud)

但我不想像那样对前缀进行硬编码。有没有办法删除正则表达式匹配的子字符串基数,甚至只是截断字符串的最后 3 个字符?我不能使用 substr() 因为它希望我知道完整的字符串长度。

编辑

我正在尝试使用 regex() 来执行此操作,但我不确定 Terraform 是否支持完整的正则表达式。

https://regex101.com/r/EGzxAq/1

我收到错误:

> regex("^.+(?=\/)","11.1.1.1/32")

>
Error: Invalid escape sequence

  on <console-input> line 1:
  (source code not available)

The symbol "/" is not a valid escape sequence selector.
Run Code Online (Sandbox Code Playgroud)

然后当我尝试转义反斜杠时:

> regex("^.+(?=\\/)","11.1.1.1/32")

>
Error: Invalid function argument

  on <console-input> line 1:
  (source code not available)

Invalid value for "pattern" parameter: invalid regexp pattern: invalid or
unsupported Perl syntax in (?=.
Run Code Online (Sandbox Code Playgroud)

yda*_*coR 6

如果您只想截断前缀以删除/32或任何其他任意前缀,那么/16您可以使用该cidrhost函数,只需将主机号指定为 0 即可获取网络地址:

$ terraform console
> cidrhost("192.168.0.0/16", 0)
192.168.0.0
> cidrhost("1.1.1.1/32", 0)
1.1.1.1
Run Code Online (Sandbox Code Playgroud)

如果您出于某种原因想为此使用正则表达式,那么您只想捕获 so 之前的部分,/因此(.*)/.*应该可以用作搜索模式。该regex函数返回捕获组列表,因此您只需要第一个:

> regex("(.*)/.*", "192.168.0.0/16")[0]
192.168.0.0
> regex("(.*)/.*", "1.1.1.1/32")[0]
1.1.1.1
Run Code Online (Sandbox Code Playgroud)