Tópico antigo, mas esse é um problema recorrente.
Aqui está uma solução usando mapfile
do bash:
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
O bash embutido mapfile
chama a função definida pelo usuário subst
(veja opções -C / -c) em cada
linha lida do arquivo de entrada input.txt
. Como a linha contém texto sem escape, eval
é usado para avaliá-lo e echo
o texto transformado para stdout (-E evita que caracteres especiais sejam interpretados).
IMHO isso é muito mais elegante do que qualquer solução baseada em sed / awk / perl / regex.
Outra solução possível é usar a substituição do próprio shell. Isso parece uma maneira mais "portátil" de não transmitir em mapfile
:
mateus@mateus:/tmp$ EOF=EOF_$RANDOM; eval echo "\"$(cat <<$EOF
$(<input.txt)
$EOF
)\""
a = 1
b = 2
Note que usamos $EOF
para minimizar o documento aqui do gato conflitante com o conteúdo input.txt.
Ambos os exemplos de: link
EDIT: Desculpe, o primeiro exemplo não trata comentários e espaços em branco corretamente. Eu vou trabalhar nisso e postar uma solução. EDIT2: Corrigir double $ RANDOM eval