toby
toby

Reputation: 693

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.

Upvotes: 5

Views: 1080

Answers (2)

glenn jackman
glenn jackman

Reputation: 246774

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

Upvotes: 4

Nullpointer
Nullpointer

Reputation: 1950

if you want to use variable then add $ sign before variable.

export my_var=foo

echo "something {{$my_var}} bar" | sed -r "s/{{(.*?)}}/$\1/g" | sed 's|[$]||g'

output:

something foo bar

Upvotes: 0

Related Questions