O Gawk aceita expressões regulares como delimitadores de campo. O seguinte elimina os espaços ao redor do sinal de igual, mas os preserva no restante da linha. As cotas são adicionadas em torno do valor, de modo que esses espaços, se houver algum, são preservados quando a atribuição do Bash é executada. Estou assumindo que os nomes das seções serão variáveis numéricas, mas se você estiver usando o Bash 4, seria fácil adaptá-lo para usar matrizes associativas com os próprios nomes das seções como índices.
awk -F ' *= *' '{ if ($1 ~ /^\[/) section=$1; else if ($1 !~ /^$/) print $1 section "=" "\"" $2 "\"" }'
Note que você também pode querer fazer a remoção de espaço mostrada por Khaled (em apenas $ 1 e seção), pois os nomes das variáveis Bash não podem conter espaços.
Além disso, esse método não funcionará se os valores contiverem sinais de igual.
Outra técnica seria usar um loop Bash while read
e executar as atribuições conforme o arquivo é lido, usando declare
, que é seguro para a maioria dos conteúdos maliciosos.
foobar=1
barfoo=2 # or you could increment an index variable each time a section is found
while IFS='= ' read var val
do
if [[ $var == \[*] ]]
then
section=$var
elif [[ $val ]]
then
declare "$var$section=$val"
fi
done < filename
Mais uma vez, os arrays associativos podem ser facilmente suportados.