I am new to shell scripting. I am using ksh.
I have this particular line in my script which I use to append text in a variable q to the end of a particular line given by the variable a
containing the line number .
sed -i ''$a's@$@'"$q"'@' test.txt
Now the variable q can contain a large amount of text, with all sorts of special characters, such as !@#$%^&*()_+:”<>.,/;'[]= etc etc, no exceptions.
For now, I use a couple of sed commands in my script to remove any ‘ and ” in this text (sed "s/'/ /g" | sed 's/"/ /g'), but still when I execute the above command I get the following error
sed: -e expression #1, char 168: unterminated `s' command
Any sed, awk, perl, suggestions are very much appreciated
Advertisement
Answer
The difficulty here is to quote (escape) the substitution separator characters @ in the sed command:
sed -i ''$a's@$@'"$q"'@' test.txt
For example, if q contains @ it will not work. The @ will terminate the replacement pattern prematurely. Example: q='a@b', a=2, and the command expands to
sed -i 2s@$@a@b@ test.txt
which will not append a@b to the end of line 2, but rather a@.
This can be solved by escaping the @ characters in q:
sed -i 2s@$@a@b@ test.txt
However, this escaping could be cumbersome to do in shell.
Another approach is to use another level of indirection. Here is an example of using a Perl one-liner. First q is passed to the script in quoted form. Then, within the script the variable assigned to a new internal variable $q. Using this approach there is no need to escape the substitution separator characters:
perl -pi -E 'BEGIN {$q = shift; $a = shift} s/$/$q/ if $. == $a' "$q" "$a" test.txt