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?
First, choose a delimiter for sed's s command. Let's say we take '#' as the delimiter for better readability. Second, escape all delimiter characters in the content of the variables. Finally, assemble the escaped content in the sed command.
The shell is responsible for expanding variables. When you use single quotes for strings, its contents will be treated literally, so sed now tries to replace every occurrence of the literal $var1 by ZZ .
Bash allows you to perform pattern replacement using variable expansion like (${var/pattern/replacement}). And so, does sed like this (sed -e 's/pattern/replacement/'). However, there is more to sed than replacing patterns in text files.
Just use double quotes instead of single quotes. You'll also need to use {} to delimit the number_line variable correctly and escape the \ , too.
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:
Variables within single quotes are not expanded, but within double quotes they are. Use double quotes in this case.
sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp
You could also make it work with eval
, but don’t do that!!
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