Substituição de tags consecutivas de múltiplas linhas por uma única linha usando sed e ignorando espaços em branco

1

Eu tenho um arquivo XML grande com várias tags.

Uma das submarcações é a seguinte:

<Products>
  <SubProduct>    ----> this line is problem
    <SubProduct>
        <Name>One</Name>
    </SubProduct>
    <SubProduct>
        <Name>One</Name>
    </SubProduct>
    <SubProduct>
        <Name>One</Name>
    </SubProduct>
    <SubProduct>
        <Name>One</Name>
    </SubProduct>
    <SubProduct>
        <Name>One</Name>
    </SubProduct>
  </SubProduct>   ----> this line is problem
</Products> 

Como visto acima, as tags Products terão várias tags SubProduct.

No entanto, uma tag de abertura e fechamento adicional do SubProduct está aparecendo como mencionado acima (com o comentário 'esta linha é um problema').

A solução seria procurar duas tags SubProduct abertas consecutivas e duas tags SubProduct de fechamento consecutivas e substituir uma em cada uma por espaço.

Como posso conseguir isso usando sed ?

Como posso pesquisar por duas tags consecutivas onde as tags estão em linhas separadas, assim como não sei quantos espaços estarão presentes entre as duas tags consecutivas (pode ser 5 espaços ou 10 espaços antes ou depois da nova tag caractere de linha).

    
por Vicky 24.01.2014 / 12:34

3 respostas

2

 sed '/<SubProduct>/{N;s/<SubProduct>$//}' filename > filename1

 sed '/<\/SubProduct>/{N;s/<\/SubProduct>$//}' filename1 > filename
    
por 24.01.2014 / 12:56
0

Talvez você possa confiar no recuo:

grep -Ev '^  </?SubProduct' < file
    
por 24.01.2014 / 14:50
0

Se sed não for um requisito absoluto, você poderá usar este script Perl:

perl -ne 'if(/(<.?SubProduct>)/){next if $l=~/$1/} $l=$_; print' file.xml
    
por 24.01.2014 / 17:49

Tags