Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Expanding environment variables with sed

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.

like image 555
toby Avatar asked Sep 26 '22 13:09

toby


1 Answers

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
like image 107
glenn jackman Avatar answered Sep 30 '22 06:09

glenn jackman