使用sed删除范围内的特定行

时间:2011-05-11 10:05:57

标签: scripting 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

我很确定必须有一种更简单的方法,然后我就不知道如何正确删除块的其他行(不删除fxlbc-t1-x-x-248 span行)。有什么想法吗?

1 个答案:

答案 0 :(得分: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

它将整个文件放在缓冲区中,然后执行标准搜索并替换缓冲的字符串。我认为它非常难看,但它确实可以解决问题。