I'm looking for an efficient way to replace a bunch of placeholders/tokens in a user supplied text file, with their corresponding values stored in a simple map or environment vars. The thing is that the template file will be supplied by the end user, so I'm looking for a "safe" way to do only the variable replacements, without any risk of code execution, etc.
Go's standard "text/template" would work for the replacement itself but imposes specific formatting requirements (e.g. dot "." before the Key) and opens up other possibilities with its function invocations, pipelines, etc.
So what I'm looking for, ideally, is a function that can parse a text file with configurable delimiters ("{{}}" or "${}" or "$##$") and replace all the detected tokens with lookups into a supplied map or their env var values. Similar to what Python's string.Template
(https://docs.python.org/2.6/library/string.html?highlight=string.template#string.Template) does.
Is there an easy way to configure or reuse the text/template library for this? Are there any other approaches that would fit the use case better? I've looked into non-golang options as well (like envsubtr
, awk
and sed
scripts etc.) so feel free to go outside of Go if something fits better.
Sample input file ('template.properties'):
var1=$#VAR_1#$
var2=$#VAR_2#$
Sample input data:
VAR_1 = apples
VAR_2 = oranges
Expected output after processing:
var1=apples
var2=oranges