我正在尝试使用 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
它将整个文件放在缓冲区中,然后对缓冲字符串执行标准搜索和替换。我认为它虽然很丑,但它确实可以解决问题。