Terraform replace函数处理换行符异常行为及解决咨询
问题分析与解决(Terraform v1.6.4)
两种尝试的行为原因
尝试1失效原因
replace(tostring(file("${path.module}/app.conf")), "/[\r\n]+/", "\n")
Terraform中\n会被直接解析为换行符,而非字面量的\n。所以这个操作只是把原文件中的换行符(不管是\r还是\n)换成了标准换行符,最终输出和原文件的换行展示完全一致,没有生成转义的\n。
尝试2的显示问题
replace(tostring(file("${path.module}/app.conf")), "/[\r\n]+/", "\\n")
这里的\\n在Terraform字符串中会被解析为字面量的\n,但Terraform的控制台输出会自动对特殊字符进行转义展示,所以你看到的是\\n——实际字符串内部已经是\n,只是输出时被额外转义了。
解决方法
要生成符合预期的、包含字面量\n且输出显示为\n的字符串,结合jsonencode函数即可:
jsonencode(replace(tostring(file("${path.module}/app.conf")), "/[\r\n]+/", "\n"))
原理
replace先统一换行格式:把所有\r或\n替换为标准换行符\n。jsonencode对处理后的字符串做JSON编码,会自动将字符串中的换行符转义为\n,同时给整个结果包裹双引号,完全匹配预期格式。
验证结果
执行上述代码后,输出将和预期完全一致:
"hearing {\n foundation {\n data-processor {\n processor {\n genericFilter=default\n }\n sets {\n keyFilters=[\n {\n className=AllowList\n }\n ]\n }\n }\n }\n}"
内容的提问来源于stack exchange,提问作者rvk_user
相关产品推荐
相关产品推荐

