2011-04-19 207 views
4

我想要做一个多行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> 

而唯一唯一地识别段启动范围是整个第一三线,并且该范围的末尾是由整个最后两行鉴定。

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

+0

你想匹配什么?显示你的输出。 – kurumi 2011-04-19 02:14:16

+0

我想匹配整个块。 (原始输入文件较大)。 – mark 2011-04-19 21:20:43

回答

0

你最好请使用perl -0777 -pe 's/.../.../'执行此操作,否则请使用适当的解析器。

请勿使用sed。真。

+0

好的,如果我找不到sed,我会看看。我不认为解析器是必要的,因为我只是匹配一个常量(多行)字符串,而不是解析xml。 xml不是常规语言的事实并不重要。 – mark 2011-04-19 05:53:34

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

使用珍珠途径(感谢!这是有用的),我才能够与小号改性剂进行多线比赛。

因为我在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。

+0

这是更改MY_PARAM_VALUE到别的在XML如下: <的context-param> ​​MY_PARAM MY_PARAM_VALUE jmc 2012-08-06 14:39:21

1

下面是使用sed的多行的处理:

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

这仅打印过滤马平

<filter-mapping> 
     TEXT 
</filter-mapping> 

我不明白相当正是你想做的事之间的文本。 ..