我正在寻找一种有效的方法来替换用户提供的文本文件中的一堆占位符/标记,并将它们的相应值存储在简单的映射或环境变量中。问题是模板文件将由最终用户提供,所以我正在寻找一种“安全”的方式来仅进行变量替换,而没有任何代码执行等风险。
Go 的标准“文本/模板”可用于替换本身,但强加了特定的格式要求(例如点“.”在 Key 之前)并通过其函数调用、管道等开辟了其他可能性。
因此,理想情况下,我正在寻找的是一个可以解析带有可配置分隔符(“{{}}”或“${}”或“$##$”)的文本文件并替换所有通过查找提供的 map 或其 env var 值检测到标记。类似于 Python 的 string.Template
( https://docs.python.org/2.6/library/string.html?highlight=string.template#string.Template ) 所做的。
有没有一种简单的方法可以为此配置或重用文本/模板库?有没有其他方法更适合用例?我也研究了非 golang 选项(如 envsubtr
、awk
和 sed
脚本等)所以请随意走出如果有更好的选择,就去吧。
示例输入文件('template.properties'):
var1=$#VAR_1#$
var2=$#VAR_2#$
示例输入数据:
VAR_1 = apples
VAR_2 = oranges
处理后的预期输出:
var1=apples
var2=oranges
最佳答案
只要您的变量名不包含 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
关于python - 仅模板变量替换。文本/模板合适吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30762761/