2014-11-21 5 views
0

Я хочу изменить следующие строки кода в сценарии оболочки. Код с сайта tomcat web.xmlЗаменить многострочный текст отступом с помощью sed

<servlet> 
     <servlet-name>default</servlet-name> 
     <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> 
     <init-param> 
      <param-name>debug</param-name> 
      <param-value>0</param-value> 
     </init-param> 
     <init-param> 
      <param-name>listings</param-name> 
      <param-value>false</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
</servlet> 

Я хочу изменить список в true от false. Как я могу это сделать в bash? Как использовать sed для замены многострочной строки? Должны ли мы заботиться о пространствах при работе с многострочной средой с помощью sed?

ответ

1

Учитывая, что данные в файле data.xml, это должно сделать работу:

$ sed '/<servlet>/,/<\/servlet>/ { 
>  /<init-param>/,/<\/init-param>/ { 
>   /<param-name>listings<\/param-name>/,/<param-value>/ s/false/true/ 
>  } 
>  }' data.xml 

Это весьма осторожным, чтобы гарантировать, что она изменяет только false к true в <param-value>, связанной с <param-name>listings</param-name> внутри <init-param> тег в теге <servlet>, но если пространства появятся неожиданно, это будет запутано (хотя это может быть исправлено, если это окажется необходимым).

Выход:

<servlet> 
     <servlet-name>default</servlet-name> 
     <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> 
     <init-param> 
      <param-name>debug</param-name> 
      <param-value>0</param-value> 
     </init-param> 
     <init-param> 
      <param-name>listings</param-name> 
      <param-value>true</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
</servlet> 

Я бы не рекомендовал использовать sed для редактирования XML, но там, где задача не так уж сложно, как и здесь, это может быть сделано, чтобы служить.

+0

Совершенно сработало. – tushR

Смежные вопросы