Imprimindo o conteúdo entre duas strings que incluem caracteres de escape (Linux / Bash)

1

Eu estou tentando escrever um script que pesquisa o meu servidor em muitos arquivos .app e gera o conteúdo entre duas strings - apenas produzindo o que ocorre entre as duas strings. Eu posso fazer isso com o AWK e o GREP, no entanto, os termos que eu preciso pesquisar têm caracteres de escape, então isso não está funcionando.

Aqui está o trecho do arquivo .dat:

   <List Variable name="lookups">
    <Value>
        <Value name="lookups" value="LSM_OPT"/>
        <OTHER GARBAGE... >             
        <Value name="lookup_name" value="123_Done"/>
        <OTHER GARBAGE... >
        <Value name="lookup_name" value="XYZ_DONE"/>
        <OTHER GARBAGE... >         
  </Variable>
  <List Variable name="lookups_for_data">
      <Value>
        <Value name="lookups" value="LSM_OPT"/>
  </Variable>

Eu preciso encontrar todos os dados entre "List Variable name=" lookups "'e" / Variable "e nada mais ... parte do problema são os caracteres de escape, mas também existem outras entradas no .dat arquivos que eu não quero capturar, mas eles contêm o meu valor de pesquisa original, mais alguns dados adicionais ... por exemplo, de cima "Nome da variável de lista=" lookups_for_data "" .. Eu não quero estes.

Eu tentei várias opções de awk e sed, mas acho que o problema são os caracteres de escape. Qualquer ajuda será muito apreciada! Obrigado pela sua ajuda!

    
por SSDdude 14.08.2018 / 22:28

1 resposta

1

Pelo som, você simplesmente quer encontrar todo o conteúdo em arquivos que ocorre entre essas duas sequências de marcadores:

<List Variable name="lookups">
   ...
   ...
</Variable>

Para fazer isso, você pode usar este comando sed :

$ sed '/<List Variable name="lookups">/,/<\/Variable>/!d;//d' file.dat
    <Value>
        <Value name="lookups" value="LSM_OPT"/>
        <OTHER GARBAGE... >
        <Value name="lookup_name" value="123_Done"/>
        <OTHER GARBAGE... >
        <Value name="lookup_name" value="XYZ_DONE"/>
        <OTHER GARBAGE... >

Isto imprime todas as linhas entre elas, mas omite as duas linhas marcadoras.

Como funciona

O texto acima procura uma linha que corresponda ao seu padrão inicial, <List Variable name="lookups"> seguida por todas as linhas até encontrar a segunda linha correspondente, <\/Variable> . Para linhas entre elas, sed não as excluirá, !d . Para todas as outras linhas, o d in !d as excluirá. O segundo //d apaga as linhas do marcador.

Se você gostaria de fazer o acima, e também imprimir as linhas do marcador, você pode alterar o comando sed acima para isso:

$ sed '/<List Variable name="lookups">/,/<\/Variable>/!d' file.dat
   <List Variable name="lookups">
    <Value>
        <Value name="lookups" value="LSM_OPT"/>
        <OTHER GARBAGE... >
        <Value name="lookup_name" value="123_Done"/>
        <OTHER GARBAGE... >
        <Value name="lookup_name" value="XYZ_DONE"/>
        <OTHER GARBAGE... >
  </Variable>
    
por 15.08.2018 / 04:33

Tags