2011-04-19 206 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> 

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