Extrai strings marcadas do arquivo de texto usando Bash

1

Eu tenho arquivos do seguinte estilo: são arquivos de configuração parametrizados; os valores dentro dos caracteres # são substituídos por valores reais de um banco de dados, dependendo do ambiente.

ABC=#PARAMETER_1#:#PARAMETER_2#
SOMETHING_ELSE=#PARAMETER_1#
SOMETHING_NEW=#PARAMETER_2##PARAMETER_3#

Eu gostaria de extrair desses arquivos os valores entre os caracteres hash / pound ( # ), para que eu possa identificar facilmente os parâmetros necessários. Não há largura de coluna padrão ou algo assim, o único padrão sendo que qualquer coisa entre dois # caracteres é substituído por um valor do banco de dados.

Esta é a saída limpa e deduida ideal:

PARAMETER_1
PARAMETER_2
PARAMETER_3

Eu vi esta pergunta, mas a diferença crucial é que pode haver qualquer número de variáveis em uma linha específica na minha situação.

Eu marquei esta questão com o Bash, mas não tem que ser, pode ser o perl etc, ele só precisa ser executado a partir da linha de comando no Unix.

    
por Rich 11.06.2012 / 11:33

1 resposta

5

Como uma primeira ideia, awk :

awk -vRS='#[^#]+#' 'RT{gsub(/#/,"",RT);p[RT]=1}END{for(i in p)print i}' the_file

Mas essa decisão pode depender das outras operações que você precisa realizar.

Explicações conforme solicitado no comentário.

awk -vRS='#[^#]+#' '   # use /#[^#]+#/ as record separator
RT {   # record terminator not empty?
  gsub(/#/,"",RT)    # remove the # parameter delimiter markup
  p[RT]=1   # store it as key in array p
}
END {   # end of input?
  for (i in p) print i   # loop through array p and print each key
}' the_file

A parte essencial é o uso da variável interna RT (terminator de registro):

   RT          The record terminator.  Gawk sets RT to the input text that
               matched the character or regular expression specified by
               RS.
    
por 11.06.2012 / 11:44

Tags