Encontre a linha mais próxima do padrão em outro padrão e mostre o número da linha

0

Eu tenho um arquivo XML muito longo que tem algumas seções repetidas. Eu quero encontrar o número da linha que é a ocorrência mais próxima da string B na string A. Digamos que eu tenha muitas instâncias de:

<section>
  ...
  <entry>
    <key>key-im-looking-for</key>
    ...
  </entry>
  ...
  <type>org.apache.whatever.package</type>
  ...
</section>

Eu quero encontrar o número da linha que contém

key-im-looking-for

que está mais próximo (ou contido na mesma seção) <type>org.apache.whatever.package</type> do termo de pesquisa, usando grep, awk ou sed.

    
por menorah84 17.12.2017 / 13:43

2 respostas

2

Primeiro de tudo, Eu acho um pouco estranho procurar por um número de linha em XML. XML é uma estrutura de árvore, onde os espaços em branco são irrelevantes, e, portanto, os números de linha também devem ser irrelevantes. Isso me faz pensar se esse é um problema XY .

Em segundo lugar, e se eu ignorar a questão do número da linha, geralmente é melhor usar um analisador XML adequado, ou algo que pode fazer consultas XPATH. Em termos de XML, sua pergunta está perto de "qual é a chave do nó cujo tipo é X". Qual é uma pergunta razoável e bem definida para perguntar, ao trabalhar com XML.

Dito isto, se o "mais próximo" <key> sempre vier antes do <type> , então você pode considerar este algoritmo no awk:

  • Se a linha corresponder a <key>key-im-looking-for< , registre o número da linha
  • Se a linha corresponder a <type>org.apache.whatever.package< , pare o processamento
  • No final, imprima o número da linha gravada

Algo parecido com isto:

awk '/<key>key-im-looking-for</ { line=NR }
     /<type>org.apache.whatever.package</ { exit }
     END { print line }' input.xml
    
por 17.12.2017 / 14:34
1

Isso deve ser possível usando os seguintes comandos:

cat -n sample.xml | grep key-im-looking-for
# or
grep -n key-im-looking-for sample.xml
    
por 17.12.2017 / 14:32

Tags