Como imprimo várias seções em um arquivo de texto?

1

Eu tenho um arquivo de texto com algo parecido com isto:

*FILESTART
line_a
line_b
line_c
*INCLUDE
file_A.key
file_B.key
*INCLUDE
file_1.key
file_2.key
file_3.key
*SOMETHING_ELSE
line_x
line_y
line_z
*END

Eu gostaria de imprimir apenas as linhas entre cada declaração INCLUDE e qualquer declaração do asterisco que vem a seguir, neste caso o seguinte:

file_A.key
file_B.key
file_1.key
file_2.key
file_3.key

O número de arquivos .key pode variar e os nomes nem sempre terminam com .key.

O código para isto será implementado em um script bash existente, então ele deve ser baseado em awk, sed ou alguma outra coisa em "bash style", não em Perl, PHP, Python, etc.

Eu tentei coisas como

sed -n '/^*INCLUDE/,/^\*/p' 

mas só imprime a primeira seção e termina na segunda linha * INCLUDE.

Alguma sugestão?

    
por user325113 20.05.2014 / 11:17

2 respostas

2

sed não funciona nesse caso porque o segundo *INCLUDE gira do intervalo de padrões e nunca é ligado novamente. Acho que isso seria mais fácil com awk , por exemplo, você poderia usar um sinalizador de impressão como este:

awk '/^\*/ { f=0 } /^\*INCLUDE/ { f=1; next } f' file

Saída:

file_A.key
file_B.key
file_1.key
file_2.key
file_3.key

Explicação

  • Quando f==1 a instrução final (ou seja, a única f ) chama a regra padrão {print $0} .
  • f está definido como 0 sempre que uma linha começa com um asterisco.
  • f está definido como 1 sempre que uma linha começa com *INCLUDE . Essas linhas também são ignoradas conforme o requisito.
por 20.05.2014 / 12:38
0

Eu usei um script rexx para fazer esse tipo de coisa. Em essência, você usa o script para "ativar ou desativar o eco" com base na presença de * include to * end ...

Um pouco de cleaver programming permite gravar a saída na memória e executá-la como um arquivo batch, completo com sub-rotinas e substituição de strings. Isso está em vigor, a natureza do programa weave de Don Knuth. Você escreve a documentação e o programa no mesmo arquivo e extrai o programa como saída.

    
por 20.05.2014 / 12:58