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

Scripting 使用sed删除范围内的特定行,scripting,sed,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>

我试图使用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>

我很确定一定有一种更简单的方法可以做到这一点,然后我一直在思考如何正确地删除块的其他行(而不删除
fxlbc-t1-x-x-248
span
行)。有什么想法吗?

一位同事给了我问题的答案:

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
sed-i:a;$!{N;ba}$s/\([^4]\+\)\(\)/\3/g'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

# 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
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