Encontre string e depois delete entre duas tags e repita

1

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.

    
por Alistair67 04.12.2014 / 12:24

2 respostas

1

Assumindo que as tags não aninhem:

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

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.

    
por 04.12.2014 / 14:29