我正在寻找一种有效的方法来替换用户提供的文本文件中的一堆占位符/标记,其相应的值存储在简单的地图或环境变量中。问题是模板文件将由最终用户提供,所以我正在寻找一个安全的"只做变量替换的方法,没有任何代码执行的风险等。
Go的标准"文字/模板"将替换本身,但强加特定的格式要求(例如点"。"在键之前),并通过其函数调用,管道等开辟其他可能性。
因此,理想情况下,我正在寻找的功能可以解析带有可配置分隔符的文本文件(" {{}}"或" $ {}&# 34;或" $ ## $")并将所有检测到的标记替换为提供的地图或其env var值。与Python的string.Template
(https://docs.python.org/2.6/library/string.html?highlight=string.template#string.Template)相似。
是否有一种简单的方法可以为此配置或重用文本/模板库?还有其他方法可以更好地适应用例吗?我也研究了非golang选项(例如envsubtr
,awk
和sed
脚本等。)如果有更好的东西,请随意离开Go。< / p>
示例输入文件(&#39; template.properties&#39;):
var1=$#VAR_1#$
var2=$#VAR_2#$
示例输入数据:
VAR_1 = apples
VAR_2 = oranges
处理后的预期输出:
var1=apples
var2=oranges
答案 0 :(得分:1)
只要您的变量名称不包含ERE元字符,这将有效:
$ cat tst.awk
NR==FNR { var2val[$1] = $NF; next }
{
for (var in var2val) {
sub("[$]#"var"#[$]",var2val[var])
}
print
}
$ awk -f tst.awk input.data template.properties
var1=apples
var2=oranges
下面的评论是关于在变量中而不是在input.data中使用映射,这可能是您正在寻找的内容:
$ cat tst.awk
BEGIN {
split(vars,tmp)
for (i in tmp) {
var2val[tmp[i]] = ENVIRON[tmp[i]]
}
}
{
for (var in var2val) {
sub("[$]#"var"#[$]",var2val[var])
}
print
}
将使用shell变量,如:
$ VAR_1=apples VAR_2=oranges gawk -v vars="VAR_1 VAR_2" -f tst.awk template.properties
var1=apples
var2=oranges
或:
$ export VAR_1=apples
$ export VAR_2=oranges
$ gawk -v vars="VAR_1 VAR_2" -f tst.awk template.properties
var1=apples
var2=oranges
或:
$ VAR_1=apples
$ VAR_2=oranges
$ VAR_1="$VAR_1" VAR_2="$VAR_2" gawk -v vars="VAR_1 VAR_2" -f tst.awk template.properties
var1=apples
var2=oranges
请注意,由于ENVIRON,这是特定于gawk的,并且需要在命令行上导出或设置VAR_1等,如上所述。
或许这就是你想要的:
$ cat tst.awk
BEGIN {
var2val["VAR_1"] = VAR_1
var2val["VAR_2"] = VAR_2
}
{
for (var in var2val) {
sub("[$]#"var"#[$]",var2val[var])
}
print
}
$ VAR_1=apples
$ VAR_2=oranges
$ awk -v VAR_1="$VAR_1" -v VAR_2="$VAR_2" -f tst.awk template.properties
var1=apples
var2=oranges
答案 1 :(得分:0)
只需使用fasttemplate [1]。它完全符合您的要求: