Salve as correspondências do grep como uma matriz

3

Eu tenho um arquivo com o seguinte conteúdo:

FILETYPE=A:B:C:D

Como posso grep out A , B , C e D e salvá-los como uma matriz em um script ksh no Linux? Eu tentei

FILETYPES='grep "FILETYPE" ${CONF_FILE} | awk -F: '{print $NF}''

Mas isso só pega o último.

    
por user548682 15.06.2016 / 10:36

2 respostas

5

No Linux, você pode fazer:

filetypes=( $(grep -Po 'FILETYPE=\K.*' ${CONF_FILE} | tr ':' ' ') )

Ou mais idiomático:

IFS=":" filetypes=( $(grep -Po 'GPGDIRLIST=\K.*' file))

Observe que usei letras minúsculas para o nome da matriz, que geralmente é mais seguro, pois as variáveis ambientais geralmente são capitalizadas. A maneira de salvar a saída de um comando como uma matriz é:

array=( 'command' )

ou

array=( $( command) )

Em seguida, o comando em si é grep com expressões regulares compatíveis com Perl ( -P ), elas nos fornecem \K , o que significa "descartar qualquer correspondência correspondente a este ponto. O -o causa grep somente imprima a parte correspondente da linha e, combinada com \K , faz com que seja impressa apenas A:B:C:D aqui. Finalmente, tr substitui a : por espaços que permitem ao shell interpretar o resultado como uma matriz:

$ echo ${filetypes[0]} 
A
$ echo ${filetypes[3]} 
D
    
por 15.06.2016 / 10:48
0

Resposta curta:

array=( 'grep -Po '(?<=FILETYPE=).*$' $CONFIG_FILE | tr ':' ' '' )

Explicação: grep usa uma asserção "look behind" para retornar o que segue "FILETYPE=".

Isso terminará declarando a matriz como:

array=(A B C D)

Então teste:

echo "${array[0]} ${array[1]} ${array[2]} ${array[3]}"

Impressões:

A B C D
    
por 15.06.2016 / 19:10

Tags