Encontre uma tag vazia em 'xml' usando o comando Unix

3

O arquivo xml é gerado com tags vazias é assim

<headertag>
</headertag>

É em linhas consecutivas e eu costumo usar um script perl para encontrá-lo com base no novo caractere de linha entre tags como padrão (\ n), mas o ambiente Unix que estou usando agora não está suportando este script perl. Tentei o mesmo com sed mas eu não consegui encontrar o lugar (número da linha) onde há uma tag vazia como essa em um arquivo .xml enorme. Existe uma solução para encontrar isso usando sed ou awk ?

    
por VRVigneshwara 20.04.2017 / 20:39

4 respostas

1

Seu XML é inválido. Usa \ em vez de / nas tags finais.

Para analisar XML, use uma ferramenta com reconhecimento de XML. Eu sei que você disse que tem restrições no sistema em que está, mas vou lhe dar uma solução que funcionará uma vez que você convencer seu gerente / qualquer que seja para operação robusta e confiável, você precisa instalar o XMLStarlet para fazer Análise XML.

Com o XMLStarlet, dado o arquivo XML

<?xml version="1.0"?>
<root>
  <headertag>
    <subtag/>
  </headertag>
  <headertag>
    <subtag>Don't delete me!</subtag>
  </headertag>
  <headertag>
</headertag>
  <headertag>
Not empty
</headertag>
</root>

o seguinte remove todas as tags vazias, independentemente de seus nomes ou em que lugar do documento elas ocorrem:

$ xml ed -d '//*[not(normalize-space())]' file.xml >newfile.xml

$ cat newfile.xml
<?xml version="1.0"?>
<root>
  <headertag>
    <subtag>Don't delete me!</subtag>
  </headertag>
  <headertag>
Not empty
</headertag>
</root>

O comando xml às vezes pode ser chamado de xmlstarlet dependendo de como ele é empacotado em seu sistema.

O XMLStarlet está disponível aqui: link ... mas veja se o seu gerenciador de pacotes padrão o possui primeiro.

    
por 20.04.2017 / 21:53
0

Você pode usar "pcregrep" em vez de grep, que suporta padrões de múltiplas linhas e tem mais opções.

Esse padrão encontra duas linhas consecutivas contendo tags de abertura e fechamento:

pcregrep -M -v "<headertag>\n\s*?</headertag>" file
  • que -M significa Multiline
  • -v significa correspondência inversa
  • \ n é o caractere de nova linha suportado no pcregrep, mas não no grep (eu acho)
  • \ s é caractere de espaço.
  • * qualquer personagem

esse padrão remove todas as tags vazias.

    
por 20.04.2017 / 22:33
0

Suposições:

  • As tags vazias que procuramos estão em uma linha sozinhas.
  • A tag de fechamento também está na sua própria linha e segue imediatamente.
  • Supõe-se que espaço em branco compõe de espaços e não de TABs.
sed -ne '
   /^ *\(<[^><]*>\) *$/!d                                   # tag opening should be on a line of its own
   s///                                                   # strip away all whitespace
   $d; N                                                    # if the tag opening is on the last line, we dont need it. Otherwise, we grab the next line
   s/^.\(.*\).\n *<\/> *$/Empty tag: <> on line num\#/p # print only in case the tagnames match across lines => we have found an empty tag
   /\n/!=                                                   # print empty tag line num
   D                                                        # delete the pattern space
' yourfile.xml
    
por 21.04.2017 / 10:20
0

Você não nos disse o que deseja fazer com as tags vazias. Portanto, vou assumir que você deseja converter esses pares de tags no formato <headertag/>

Aqui está um script simples de sed que fará exatamente isso para o caso de exemplo que você nos forneceu:

sed -E ':a;N;$!ba;s#<([^>]+)>\n</>#</>#g' infile > outfile

    
por 21.04.2017 / 05:39

Tags