sed substitution with Bash variables

csta picture csta · Oct 6, 2011 · Viewed 66.7k times · Source

I am trying to change the values in a text file using sed in a Bash script with the line,

sed 's/draw($prev_number;n_)/draw($number;n_)/g' file.txt > tmp

This will be in a for loop. Why is it not working?

Answer

k.parnell picture k.parnell · Oct 6, 2011

Variables inside ' don't get substituted in Bash. To get string substitution (or interpolation, if you're familiar with Perl) you would need to change it to use double quotes " instead of the single quotes:

$ # Enclose the entire expression in double quotes
$ sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp

$ # Or, concatenate strings with only variables inside double quotes
$ # This would restrict expansion to the relevant portion
$ # and prevent accidental expansion for !, backticks, etc.
$ sed 's/draw('"$prev_number"';n_)/draw('"$number"';n_)/g' file.txt > tmp

$ # A variable cannot contain arbitrary characters
$ # See link in the further reading section for details
$ a='foo
bar'
$ echo 'baz' | sed 's/baz/'"$a"'/g'
sed: -e expression #1, char 9: unterminated `s' command


Further Reading: