我正在尝试进行多行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 :(得分: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
。真。