找到字符串然后删除两个标签之间并重复

找到字符串然后删除两个标签之间并重复

如何在文件中找到一个字符串,然后找到它前面的标签的第一个实例,然后删除该标签与其结束标签之间的所有内容,然后在文件的其余部分重复这个过程?

我一直在寻找sed这个,但据我所知,您必须指定要删除的行数,并且两个标记之间的行数可能会有所不同。

答案1

假设标签不嵌套:

perl -0777 -pe 's{<tag>.*?</tag>}{
  my $r = $&; $r =~ /string/ ? "" : $r}gse' < "$file"

答案2

执行此操作sed。这个想法是每次都堆叠标签之间的行。当堆栈包含字符串时,删除它,否则打​​印它。

sed ':n
/<tag1>.*string.*<tag2>/d;$q;N
/<tag1>.*<tag2>/!bn'

如果文件非常大,或者更准确地说,如果标签 1 和 2 之间有大量文件,反之亦然,则此命令可能会变得很麻烦,甚至难以处理。通过更多的代码,它可以被优化来处理这些情况——而且 GNUsed在大多数情况下应该不会给你带来任何困难。

相关内容