com zsh :
print -r -- "${(e)$(<reports/my_report.sql)}"
Com qualquer shell parecido com o Bourne (incluindo zsh ):
eval "cat << EOF
$(cat reports/my_report.sql)
EOF"
Ambos expandirão todos os '...' , $(...) , $((...)) , $[...] , $xxx e ${xxx} . Então, você precisará escapar dos caracteres dólar e backtick que não deseja expandir.
Além disso, para o segundo, o conteúdo do arquivo não deve conter uma linha que consiste nos três caracteres EOF (que para SQL não deve ser um problema).
Como alternativa, você pode fazer:
perl -pe 's/\${(\w+)}/$ENV{$1}/g' reports/my_report.sql
Você precisará export das variáveis, para perl estar ciente delas.
Por que sua solução não funciona e não está nem perto de funcionar, você pode executá-la depois de set -x para ver o que está acontecendo:
$ echo "SELECT ${sql_year} AS year" | sed -e "s/\(\${[a-zA-Z_]*}\)/'eval "echo ''"'/"
+ echo 'SELECT 2013 AS year'
++ eval 'echo '\'''\'''
+++ echo ''
+ sed -e 's/\(${[a-zA-Z_]*}\)//'
SELECT 2013 AS year
Usando aspas duplas, o shell expande as variáveis e a substituição de comandos antes de chamar echo e sed . Então, você realmente correu:
echo 'SELECT 2013 AS year' | sed -e 's/\(${[a-zA-Z_]*}\)//'
sed não pode executar o código. Portanto, mesmo se você tivesse usado aspas simples, sed não teria expandido o '...' .