
Eu tenho um conteúdo de arquivo conf como abaixo.
arquivo.conf:
key name
value pswd
Agora quero escrever um script para ter as duas variáveis como acima
script.sh
key="name" #key as variable
value="pswd" #value as variable
. /path/to/file.conf
está me dando um erro de comando de chave e valor não encontrado.
Responder1
tentar
awk 'NF>1 { var=$1 ; $1 = "" ; printf "%s=\"%s\"\n",var,$0; }' file.conf > script.sh
esta linha awk basicamente usa primeiro o campo (quando mais de dois) como nome da var, depois o restante da linha como valor (daí o $1=""
truque sujo).
De acordo com a sugestão de Terdon, desde que o valor não tenha espaço.
awk '{print $1 "=" $2 }' file.conf > script.sh
Responder2
Supondo que seu shell seja do estilo bourne, onde as variáveis são definidas com var="value"
, com GNU sed
, você pode fazer:
sed -i 's/ /="/;s/$/"/' file.conf
Ou
sed -i -e 's/ /="/' -e 's/$/"/' file.conf
Ou
perl -i -pe 's/ /="/;s/$/"/' file.conf
Tudo isso é basicamente a mesma ideia. Tanto no GNU quanto sed
no perl
, a -i
opção editará o arquivo no local e s/foo/bar/
substituirá foo
por bar
em cada linha de entrada. Assim, a primeira substituição substituirá o 1º espaço por ="
e a segunda substituição adicionará um "
no final da linha ( $
).
Tudo isso irá converter isso:
key name
value pswd
key1 foo bar
Para isso:
key="name"
value="pswd"
key1="foo bar"
Responder3
Eu interpretei o que você queria de uma forma um pouco diferente... ou seja, que você quer uma forma de fonte file.conf
como se fosse um conjunto de atribuições de variáveis de shell - então em vez de
. /path/to/file.conf
tente usar
eval `while read var val; do echo "${var}='${val}'"; done < /path/to/file.conf`
Você precisaria ter certeza de que o formato file.conf
não se desviava do descrito aqui.
Observe que estou usando eval deliberadamente em toda a saída, em vez de chamar eval em cada atribuição dentro do loop, porque não tenho certeza se as atribuições de variáveis serão globais lá (elas podem ser feitas em um sub-shell por causa da entrada redirecionada - alguém sabe com certeza? Suponho que poderia testá-lo :-)
Responder4
As aspas duplas podem não ser a melhor escolha, pois dentro delas os caracteres $
, "
, barra invertida e crase ainda são especiais.
Eu usaria caracteres de aspas simples ( key='name'
), pois o único caractere com o qual você precisa se preocupar é '
ele mesmo.
sed "s/'/'\\\\''/g;s/ /='/;s/\$/'/" < file.conf > file.sh