I am trying to write a sed command to replace tokens in a file with values from environment variables like so:
export my_var=foo
echo 'something {{my_var}} bar' | sed -r "s/\{\{(.*?)\}\}/$\1/g"
I want to grab the name of the token (my_var in this case) and then substitute in the value of the environment variable with the same name.
Is this possible? Current the above prints something $my_var bar
rather than something foo bar
which is what I want.
I'm open to using another tool such awk instead if it's not possible with sed.
After you replace {{my_var}}
with $my_var
, you need to send the string for a second round of substitution explicitly.
with eval
$ eval echo "$(echo 'something {{my_var}} bar' | sed 's/{{\([^}]\+\)}}/$\1/g')"
something foo bar
or with a subshell
$ echo 'echo something {{my_var}} bar' | sed 's/{{\([^}]\+\)}}/$\1/g' | sh
something foo bar
Perl can do this 2nd round of evaluation on the replacement text only, not the whole output (with the s///
function's e
modifier):
$ echo 'something {{my_var}} bar' | perl -pe 's/\{\{(\w+)\}\}/$ENV{$1}/eg'
something foo bar
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With