如何用sed替换同一文件中的多行?

时间:2013-04-26 18:29:59

标签: linux bash file shell sed

我想用tomcat命令替换server.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;

为什么? 我怎么能这样做?

1 个答案:

答案 0 :(得分: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":'

点(.)被转义,因为它是一个匹配任何字符的特殊字符。