is there an escape character for envsubst?

export DOLLAR='$'

export THIS=THAT
echo '${DOLLAR}THIS' | envsubst

Or more clear:

export THIS=THAT
echo '${DOLLAR}THIS' | DOLLAR='$' envsubst

If you give envsubst a list of variables, it only substitutes those variables, ignoring other substitutions. I'm not exactly sure how it works, but something like the following seems to do what you want:

$ export THIS=THAT FOO=BAR
$ echo 'dont substitute $THIS but do substitute $FOO' | envsubst '$FOO'
dont substitute $THIS but do substitute BAR

Note that $THIS is left alone, but $FOO is replaced by BAR.


My workaround is as follows:

Original template:

$change_this
$dont_change_this

Editted template:

$change_this
§dont_change_this

Now you can process:

envsubst < $template | sed -e 's/§/$/g'

This relies on the character § not occurring anywhere else on your template. You can use any other character.