使用sed替换带缩进的多行文本

时间:2014-11-21 21:32:22

标签: bash shell

我想在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处理多行时我们是否需要处理空格?

1 个答案:

答案 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,但在任务不太困难的地方,就像在这里一样,可以使用它。