2013-04-26 110 views
1

我想用sed命令替換tomcatserver.xml文件中的一些行。如何用sed替換同一個文件中的很多行?

<Server port="8005" shutdown="SHUTDOWN"> 

<Server port="8205" shutdown="SHUTDOWN"> 

<Connector port="8080" protocol="HTTP/1.1 

<Connector port="8280" protocol="HTTP/1.1 

我試圖這樣做,但tmp_server_2.xml總是空:

sed -e "s/<Server port=\"8005\" shutdown=\"SHUTDOWN\">/<Server port=\"$short_port\" shutdown=\"SHUTDOWN\">/" /company/$tomcat_port/conf/server.xml > tmp_server.xml; 
sed -e "s/<Connector port=\"8080\" protocol=\"HTTP/1.1\"/<Connector port=\"$port\" protocol=\"HTTP/1.1\"/" ./tmp_server.xml > ./tmp_server_2.xml; 

這是爲什麼? 我該怎麼做?

回答

4

sed不明白你的第二個命令,因爲你也沒能逃脫這裏的斜線:

sed -e "s/<Connector port=\"8080\" protocol=\"HTTP/1.1\"/<Connector port=\"$port\" protocol=\"HTTP/1.1\"/" ./tmp_server.xml > ./tmp_server_2.xml 
               ^           ^

因此:

sed: -e expression #1, char 46: unknown option to `s' 

由於斜線作爲分隔符s///,你必須逃脫他們:

sed "s/<Connector port=\"8080\" protocol=\"HTTP\/1\.1/<Connector port=\"$port\" protocol=\"HTTP\/1.1\"/" 

但它會如果你只是使用另一個分隔符更容易您還可以使用單引號,以避免轉義雙引號,但是無法展開變量在單引號,所以:

sed 's:<Connector port="8080" protocol="HTTP/1\.1:<Connector port="'"$port"'" protocol="HTTP/1.1":' 

的點(.)被轉義,因爲它是任何字符匹配一個特殊字符。

+0

非常感謝! – 2013-04-26 20:16:45