Aqui está um script shell + sed que selecionará os nomes e valores das variáveis (na frente do loop) e os editará no arquivo (em várias passagens dentro do loop):
#!/bin/sh
sed -nr 's/^([^=#][^=]*)=(.*)$/\n/p' "$1" |
while read var ; read val ; do
sed -ri "s/^#?($var=) *$/$val/" "$2"
done
O primeiro parâmetro do script é o arquivo com valores ( myfile.txt
). O segundo é o arquivo a ser preenchido ( responsefile.txt
). O segundo arquivo é editado no lugar. O script não trata o espaço em branco especialmente (exceto os espaços após =
em responsefile.txt
), pois não ficou claro na questão como deveria ser.
Aqui está a extensão do seu script AWK concluído para ser funcional em todos os casos apresentados em seus arquivos de demonstração. Primeiro, ele preencherá o array associativo do primeiro arquivo, depois modificará o conteúdo do segundo arquivo e o enviará para stdout
. Eu não estou apresentando isso como um verso para mantê-lo legível:
#!/usr/bin/awk -f
BEGIN { FS="=" }
NR==FNR { a[$1]=$0; next }
$1 in a { $0=a[$1] }
/^#/ { var=$1; sub(/^#/, "", var); if(var in a) { $0=a[var] } }
1
Seu script só precisava de um tratamento especial para tarefas comentadas. Os parâmetros do script são os mesmos do primeiro script, mas a saída é enviada para stdout
e o segundo arquivo não é modificado.