sed多线范围匹配

时间:2011-04-19 00:54:11

标签: xml regex sed

我正在尝试进行多行sed范围匹配。我的意思是,范围的开头本身就是多行。来源看起来像这样

<filter-mapping>
        <filter-name>Cache Filter - Resource</filter-name>
        <url-pattern>*.css</url-pattern>
</filter-mapping>
<filter-mapping>
        <filter-name>Cache Filter - Resource</filter-name>
        <url-pattern>*.html</url-pattern>
</filter-mapping>
<filter-mapping>
        <filter-name>Cache Filter - Resource</filter-name>
        <url-pattern>*.js</url-pattern>
</filter-mapping>
<filter-mapping>
        <filter-name>Cache Filter - Resource JSP</filter-name>
        <url-pattern>*.jsp</url-pattern>
</filter-mapping>

启动范围的唯一唯一标识段是整个前三行,并且范围的末尾由最后两行标识。

有没有办法指定多线模式来开始范围匹配?

5 个答案:

答案 0 :(得分:4)

好吧,所以我选择了tchrist的解决方案并使用了perl。 这是我的正则表达式的样子(在这个例子中,我正在评论xml)。我也在对文件进行内联替换。

perl -0777 -pi -e 's|([\t ]*<filter-mapping>\s*<filter-name>Cache Filter - Resource</filter-name>\s*<url-pattern>\*\.css[^\0]*<filter-name>Cache Filter - Resource JSP</filter-name>\s*<url-pattern>\*\.jsp</url-pattern>\s*</filter-mapping>)|<!-- \1 -->|g' inputfile

答案 1 :(得分:1)

最好的在线sed教程涵盖了这个主题: http://www.grymoire.com/Unix/Sed.html#uh-51

如果你是sed的新手,你可能想要进一步开始页面,就像这里: http://www.grymoire.com/Unix/Sed.html#uh-47

答案 2 :(得分:1)

使用Pearl方法(谢谢!这很有用),我只能使用 s 修饰符执行多行匹配。

由于我在Tomcat的web.xml中使用它来替换参数,所以我会为感兴趣的人放置我的bash脚本的副本(欢迎评论)。

#!/bin/bash
if [[ -z "$3" ]] ; then
        echo "Sets a Tomcat web.xml parameter with a new value"
        echo "SINTAX: $0 PARAM_NAME NEW_VALUE FILE"
        exit 1
fi

PARAM_NAME="$1"
NEW_VALUE="$2"
FILE="$3"

perl -0777 -pi -e  "s|(<param-name>${PARAM_NAME}</param-name>.*?<param-value>).*?(</param-value>)|\${1}${NEW_VALUE}\${2}|s" ${FILE}

注意: \ $ {1} 部分是以这种方式完成的,因为$ {NEW_VALUE}可能是一个或多个数字,而且会混淆perl。

答案 3 :(得分:1)

这是一个使用sed of multi-line的处理:

sed ' /<filter-mapping>/,/<[/]filter-mapping>/{/filter-mapping/d}' FILE

这仅打印filter-maping

之间的文本
<filter-mapping>
        TEXT
</filter-mapping>

我不太清楚你想要做什么......

答案 4 :(得分:0)

您最好使用perl -0777 -pe 's/.../.../'执行此操作,或者使用正确的解析器。

请勿使用sed。真。