Shell: verifica o arquivo de formatação de linha e faz loop sobre as linhas de arquivo

1

Preciso verificar dois itens:

  1. O formato do conteúdo do arquivo
  2. Itere sobre esse conteúdo:

Portanto, o arquivo de conteúdo deve ser:

key1=value
key2=value2
...

Assim, cada linha deve ter o formato key=value . Espaços não são permitidos antes ou depois do = . Este conteúdo de arquivo tem que ser um arquivo de formato env.

Por outro lado, preciso dividir cada linha em key e value dentro de um loop.

Alguma idéia?

    
por Jordi 26.06.2018 / 16:15

2 respostas

3

Com bash:

n=0
while IFS="=" read -r key value; do
    ((n++))
    if [[ -z $key ]]; then echo "missing key on line $n"; continue; fi
    if [[ -z $value ]]; then echo "empty value on line $n"; continue; fi
    echo "key:>$key<; value:>$value<"
done <<END
key1=value1
key2=value2
key3=
=value3
foo

key4=value4=value5=value6
END

saídas

key:>key1<; value:>value1<
key:>key2<; value:>value2<
empty value on line 3
missing key on line 4
empty value on line 5
missing key on line 6
key:>key4<; value:>value4=value5=value6<
    
por 26.06.2018 / 18:55
2

Dado este arquivo como input :

key1=value1
key2=value2
key3=
=value3
key4=value4

Podemos usar = como um separador de campo para awk :

$ awk -F= '!($1 && $2 && NF==2) { print "File failed validation on line " NR; exit 1} { print $1, $2 }' input
key1 value1
key2 value2
File failed validation on line 3

Para lançar mensagens de erro de validação ao erro padrão, a instrução print pode ser modificada e, para continuar processando após a exibição de um erro, altere a instrução exit para uma instrução next :

$ awk -F= '!($1 && $2 && NF==2) { print "File failed validation on line " NR | "cat 1>&2"; next } { print $1, $2 }' input
[stdout] key1 value1
[stdout] key2 value2
[stdout] key4 value4
[stderr] File failed validation on line 3
[stderr] File failed validation on line 4

A validação é feita em três etapas; Se algum desses critérios não for atendido, o erro será lançado e, no primeiro exemplo, a execução será cancelada com um código de saída de estado de erro:

  • $1 - Certifique-se de que existe (na linguagem da especificação de entrada) uma "chave"
  • $2 - Certifique-se de que existe (na linguagem da especificação de entrada) um "valor"
  • NF==2 - Assegure-se de que existam apenas dois campos; a "chave" e "valor" acima mencionados
por 26.06.2018 / 17:37