
Tengo un contenido de archivo de configuración como el siguiente.
archivo.conf:
key name
value pswd
Ahora quiero escribir un script para tener las dos variables como se muestra arriba.
guión.sh
key="name" #key as variable
value="pswd" #value as variable
. /path/to/file.conf
Me está dando un error de comando de clave y valor no encontrado.
Respuesta1
intentar
awk 'NF>1 { var=$1 ; $1 = "" ; printf "%s=\"%s\"\n",var,$0; }' file.conf > script.sh
Esta línea awk básicamente usa el primer archivo (cuando hay más de dos) como nombre de var, luego el resto de la línea como valor (de ahí el $1=""
truco sucio).
Según la sugerencia de Terdon, el valor proporcionado no tiene espacio.
awk '{print $1 "=" $2 }' file.conf > script.sh
Respuesta2
Suponiendo que su shell es estilo Bourne, donde las variables se definen con var="value"
, con GNU sed
puede hacer:
sed -i 's/ /="/;s/$/"/' file.conf
O
sed -i -e 's/ /="/' -e 's/$/"/' file.conf
O
perl -i -pe 's/ /="/;s/$/"/' file.conf
Todos estos son básicamente la misma idea. Tanto en GNU sed
como en perl
, el -i
modificador editará el archivo en su lugar y s/foo/bar/
lo sustituirá foo
por bar
en cada línea de entrada. Entonces, la primera sustitución reemplazará el primer espacio con ="
y la segunda sustitución agregará una "
al final de la línea ( $
).
Todos estos convertirán esto:
key name
value pswd
key1 foo bar
A esto:
key="name"
value="pswd"
key1="foo bar"
Respuesta3
Interpreté lo que querías de forma un poco diferente... es decir, que quieres una manera de obtener fuentes file.conf
como si fuera un conjunto de asignaciones de variables de shell, así que en lugar de
. /path/to/file.conf
intenta usar
eval `while read var val; do echo "${var}='${val}'"; done < /path/to/file.conf`
Deberá asegurarse de que el formato de file.conf
no se desvíe de lo que ha descrito aquí.
Tenga en cuenta que estoy usando deliberadamente eval en toda la salida en lugar de llamar a eval en cada asignación dentro del bucle, porque no estoy seguro de si las asignaciones de variables serán globales allí (pueden realizarse en un subshell debido a la entrada redirigida). - ¿Alguien lo sabe con seguridad? Supongo que podría probarlo :-)
Respuesta4
Es posible que las comillas dobles no sean la mejor opción, ya que dentro de ellas, los caracteres $
, "
, barra invertida y comilla invertida siguen siendo especiales.
En su lugar, usaría comillas simples ( key='name'
), ya que entonces el único carácter del que debe preocuparse es '
él mismo.
sed "s/'/'\\\\''/g;s/ /='/;s/\$/'/" < file.conf > file.sh