Hilo antiguo, pero este es un problema recurrente. Aquí hay una solución usando bash mapfile
:
mateus@mateus:/tmp$ cat input.txt
a = $a
b = $b
mateus@mateus:/tmp$ echo a=$a, b=$b
a=1, b=2
mateus@mateus:/tmp$ function subst() { eval echo -E "$2"; }
mateus@mateus:/tmp$ mapfile -c 1 -C subst < input.txt
a = 1
b = 2
Bash builtin mapfile
llama a la función definida por el usuario subst
(consulte las opciones -C / -c) en cada línea leída del archivo de entrada input.txt
. Dado que la línea contiene texto no escapado, eval
se utiliza para evaluarlo y echo
el texto transformado en stdout (-E evita que se interpreten caracteres especiales).
En mi humilde opinión, esta es una solución mucho más elegante que cualquier solución basada en sed / awk / perl / regex.
Otra posible solución es usar la propia sustitución de shell. Esto parece una forma más "portátil" que no se transmite en mapfile
:
mateus@mateus:/tmp$ EOF=EOF_$RANDOM; eval echo "\"$(cat <<$EOF
$(<input.txt)
$EOF
)\""
a = 1
b = 2
Tenga en cuenta que usamos $EOF
para minimizar el documento here-conflict de cat con contenido input.txt
Ambos ejemplos de: https://gist.github.com/4288846
EDITAR: Lo sentimos, el primer ejemplo no maneja los comentarios y el espacio en blanco correctamente. Trabajaré en eso y publicaré una solución.
EDIT2: Fix double $ RANDOM eval
$RANDOM
generará números posiblemente diferentes? Cuando escriboecho $RANDOM $RANDOM
en una terminal, obtengo dos números diferentes.