Anand Rao
Anand Rao

Reputation: 323

using sed to replace string with special characters

I'm basically trying to modify tomcat server.xml connector tag and add a address attribute to it.

I want to find the below string in server.xml

I'm doing the below with sed,

export currlistener=\<Connector\ port\=\"18443\"
export newlistener=\<Connector\ port\=\"18443\"\ address\=\"127.0.0.1\"\
echo $currlistener
echo $newlistener
sed -i -e 's/'$currlistener'/'$newlistener'/g' server.xml

But I get the error

sed: -e expression #1, char 12: unterminated `s' command

I guess sed is interpreting the special characters and erroring out.

How would I do the same using awk?

Regards, Anand.

Upvotes: 0

Views: 77

Answers (1)

John1024
John1024

Reputation: 113824

Using sed

The problem was that the shell variables were unquoted. Try:

sed -i -e "s/$currlistener/$newlistener/g" server.xml

Using awk

The sed solution requires that you trust the source of your shell variables. For a case like this, awk is safer. Using a modern GNU awk:

awk -i inplace -v a="$currlistener" -v b="$newlistener" '{gsub(a, b)} 1' server.xml

Or, using other awk:

awk -v a="$currlistener" -v b="$newlistener" '{gsub(a, b)} 1' server.xml >tmp && mv tmp server.sml

Simplifying the variable assignments

Separately, the shell variables can be defined without requiring so many escapes:

currlistener='<Connector port="18443"'
newlistener='<Connector port="18443" address="127.0.0.1"'

It is only necessary to export them if they are to be used in a child process.

Upvotes: 2

Related Questions