使用 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行)。知道吗?

一位

同事给了我问题的答案:

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

它将整个文件放在缓冲区中,然后对缓冲字符串执行标准搜索和替换。我认为它虽然很丑,但它确实可以解决问题。

最新更新