2013-04-26 2 views
1

Я хотел бы заменить некоторые строки tomcatserver.xml файл с командой sed.Как заменить много строк в одном файле с помощью 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

большое спасибо! –