如何在文件中找到一个字符串,然后找到它前面的标签的第一个实例,然后删除该标签与其结束标签之间的所有内容,然后在文件的其余部分重复这个过程?
我一直在寻找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
在大多数情况下应该不会给你带来任何困难。