Encontre um padrão em XML usando o comando unix

1

Eu tenho XML como abaixo

<a>
</a>
<a>
<b></b>
<c></c>
</a>

Eu preciso encontrar números de linha das tags vazias que estão em duas linhas consecutivas sem nenhuma tag entre elas, como abaixo.

    <a>
    </a>

Output: 1 -> line number

Estou usando o PCGREP, mas meus administradores unix restringiram ou não os comandos perl, portanto, isso pode ser feito usando o SED ou o AWK? Nota: xmlstarlet não é suportado também.

    
por user7952074 08.08.2017 / 11:40

1 resposta

2

Solução sed

#!/bin/bash

sed -nr '
    /^<[^<]*>$/ {
        N
        /^<([^<]*)>\n<\/>$/=
    }
' "$1" | awk '{print "Output: "$NF - 1" -> line number"}'

Explicação:

  1. %código%
    • sed se tivermos uma tag aberta na linha
    • /^<[^<]*>$/ - acrescenta a próxima linha de entrada no espaço padrão.
    • N e verifique se a próxima linha tem a tag fechada equivalente.
    • se for esse o caso, imprima este número de linha pelo comando /^<([^<]*)>\n<\/>$/ . Tenha em mente que é o número da linha de tag fechada. Devemos diminuí-lo em mais um.
  2. = - diminui o número da linha e imprime na string da mensagem.

Teste:

Entrada

<a>
</a>
<a>
<b></b>
<c></c>
<c>
</c>
</a>

Resultado

./empty_tag.sh input.txt 
Output: 1 -> line number
Output: 6 -> line number

solução AWK

Uso: awk

#!/bin/bash

awk -F'[>/]' '
    line_num {
        if(NF == 3) {print "Output: " line_num " -> line number";}
        line_num = 0;
    }
    NF == 2 {line_num = NR;}
' "$1"
    
por 08.08.2017 / 13:20