【发布时间】:2015-08-26 02:01:29
【问题描述】:
我正在寻找一种有效的方法来替换用户提供的文本文件中的一堆占位符/标记,并将它们的相应值存储在简单的地图或环境变量中。问题是模板文件将由最终用户提供,所以我正在寻找一种“安全”的方式来只进行变量替换,而不会有任何代码执行风险等。
Go 的标准“文本/模板”将适用于替换本身,但会施加特定的格式要求(例如,在 Key 之前添加点“.”)并通过其函数调用、管道等打开其他可能性。
因此,理想情况下,我正在寻找一个可以解析具有可配置分隔符(“{{}}”或“${}”或“$##$”)的文本文件并替换所有通过查找提供的地图或其 env var 值检测到的令牌。类似于 Python 的 string.Template (https://docs.python.org/2.6/library/string.html?highlight=string.template#string.Template) 所做的。
是否有一种简单的方法可以为此配置或重用文本/模板库?还有其他更适合用例的方法吗?我也研究了非 golang 选项(例如 envsubtr、awk 和 sed 脚本等),所以如果有更好的选择,请随意离开 Go。
示例输入文件('template.properties'):
var1=$#VAR_1#$
var2=$#VAR_2#$
输入数据示例:
VAR_1 = apples
VAR_2 = oranges
处理后的预期输出:
var1=apples
var2=oranges
【问题讨论】:
-
您可以手动读取文件并对变量/替换执行连续的替换操作,并且您可以通过即时构建输出来有效地执行此操作。只需几行代码(约 30 行)即可完成。请参阅此问题+答案,该问题在 Java 中显示:Alternative to successive String.replace
-
谢谢 icza。实现我自己的替换器绝对是一种选择,但我希望找到一个可以做到这一点的高效灵活的库。替换字符串中的标记似乎是一项足够通用的任务,其他人早就可以解决了。
-
像Mustache 这样的东西适合你吗?
-
n0741337,小胡子是个不错的选择。我没想过要寻找 Go 实现。但是,它仍然支持“Sections”,语法类似于
{{#。你知道是否有办法禁用那块吗? -
您可以预先过滤输入(无论如何都是好主意),如果它包含 {{# 则拒绝它
标签: python awk sed go go-templates