You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用Terraform的format函数从字符串开头而非结尾截断内容?

如何使用Terraform的format函数从字符串开头而非结尾截断内容?

这个困扰我之前也碰到过!首先得明确一点:Terraform的format函数是遵循C语言printf规范的,而原生的printf格式符里,并没有直接支持从字符串开头截断的写法——你试的%-14s里的负号只是用来控制输出内容左对齐,和截断的起始方向完全没关系,所以才会得到和%.14s类似的截断末尾的结果。

那该怎么实现从开头截断(也就是保留字符串的最后N个字符)呢?这里有两个实用的方案:

方案一:用substr函数直接截取(更直观)

其实不用绕format的弯子,Terraform的substr函数可以直接帮我们取字符串的后14个字符,配合lengthifelse还能兼容字符串长度小于等于14的情况:

# 目标:保留字符串的最后14个字符
truncated_str = ifelse(
  length(var.project_name) > 14,
  substr(var.project_name, length(var.project_name) - 14, 14),
  var.project_name
)

简单解释下逻辑:

  • 先判断字符串长度是否超过14,如果没超过就直接用原字符串
  • 如果超过了,就从总长度-14的位置开始截取14个字符,刚好拿到原字符串的最后14位

方案二:继续用format配合字符串反转(你的思路优化版)

如果你一定要用format函数来实现,那你自己想到的反转两次的方法其实是个很巧妙的小技巧,而且完全可行!可以写成更简洁的复用形式:

truncated_str = strrev(format("%.14s", strrev(var.project_name)))

这个逻辑也很清晰:先把原字符串反转,用format截断反转后字符串的末尾(对应原字符串的开头部分),最后再反转回来,就得到了保留原字符串最后14个字符的结果。

总结一下:如果追求代码的可读性,优先选substr的方案;如果场景里一定要贴合format函数的使用,那反转两次的方法完全没问题,这也是很多开发者碰到printf截断方向限制时的常用 workaround~

火山引擎 最新活动