Assumindo que as tags não aninhem:
perl -0777 -pe 's{<tag>.*?</tag>}{
my $r = $&; $r =~ /string/ ? "" : $r}gse' < "$file"
Como posso encontrar uma string em um arquivo, encontrar a primeira instância de uma tag que a precede e depois excluir tudo entre essa tag e a tag de fechamento e, em seguida, repetir o processo ad nauseam no restante do arquivo?
Eu estive olhando sed
para isso, mas, até onde eu vejo, você teria que especificar um número de linhas para excluir e a quantidade de linhas entre as duas tags pode variar.
Você pode fazer isso com sed
. A ideia é empilhar as linhas entre as tags todas as vezes. Quando uma pilha contém uma string, apague-a ou imprima-a.
sed ':n
/<tag1>.*string.*<tag2>/d;$q;N
/<tag1>.*<tag2>/!bn'
Se o arquivo for muito grande - ou, mais precisamente, se houver uma quantidade muito grande de arquivos entre as tags 1 e 2 ou vice-versa - esse comando pode ficar pesado ou até intratável. Com mais algum código, ele pode ser otimizado para lidar com essas situações - e um GNU sed
não deve apresentar dificuldades na maioria das situações dessa maneira.
Tags text-processing