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 mapfilellama 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, evalse utiliza para evaluarlo y echoel 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 $EOFpara 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
$RANDOMgenerará números posiblemente diferentes? Cuando escriboecho $RANDOM $RANDOMen una terminal, obtengo dos números diferentes.