我想在shell脚本中更改以下代码行。代码来自tomcat的web.xml
<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>
我想将false的列表更改为true。我怎样才能在bash中实现这一目标。 如何使用sed替换多行字符串?使用sed处理多行时我们是否需要处理空格?
答案 0 :(得分: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>
。 {1}}标记,但是如果空格出现意外,它会混淆(尽管如果证明有必要可以修复)。
输出:
sed
我不建议使用{{1}}来编辑XML,但在任务不太困难的地方,就像在这里一样,可以使用它。