2011-05-11 41 views
0

我試圖用sed刪除一對匹配模式內的塊。鑑於塊,如:使用sed刪除範圍內的特定行

      <span 
class="fxlbc-t1-x-x-172">M<span 
class="small-caps">A</span><span 
class="small-caps">R</span><span 
class="small-caps">S</span></span> 
           <span 
class="fxlbc-t1-x-x-248">R<span 
class="small-caps">A</span><span 
class="small-caps">I</span><span 
class="small-caps">S</span><span 
class="small-caps">O</span><span 
class="small-caps">N</span></span> 

我需要刪除塊:

      <span 
class="fxlbc-t1-x-x-172">M<span 
class="small-caps">A</span><span 
class="small-caps">R</span><span 
class="small-caps">S</span></span> 

我嘗試這樣做,在sed。我在使用N選擇器時碰到的第一個問題是奇數行和偶數行的問題。

sed -i 'N 
/.*<span \nclass="fxlbc-t1-x-x-172".*/,/.*class="fxlbc-t1-x-x-248".*/ { 
    /.*fxlbc-t1-x-x-172.*/d 
    }' test.html 

# Add an empty line 
sed -i '1i\ ' test.html 

sed -i 'N 
/.*<span \nclass="fxlbc-t1-x-x-172".*/,/.*class="fxlbc-t1-x-x-248".*/ { 
    /.*fxlbc-t1-x-x-172.*/d, 
    /.* 
    }' test.html 

我敢肯定,必須有這樣做的更簡單的方法,然後我卡着如何正確取出塊的其他線路(不:我已經這樣做解決了這個問題刪除線)。任何想法?

回答

1

我被一個同事給出的回答我的問題:

sed -i ':a ; $! { N ; ba } ; $s/\(<span\(\|\n\|\t\)\+class="fxlbc-t1-x-x-172">[^4]\+\)\(<span\(\|\n\|\t\)\+class="fxlbc-t1-x-x-248">\)/\3/g' test.html 

它把整個文件中的一個緩衝區,然後做一個標準的搜索和緩衝的字符串替換。我認爲這很醜陋,但它的確有訣竅。