Você pode fazer algo como:
eval "cat << __end_of_template__
$(sed 's/[\$']/\&/g;s/<%= @\([^ ]*\) %>/${}/g' < template)
__end_of_template__"
Ou seja, o sed substitui todos os <%= @xxx %>
por ${xxx}
depois de ter escapado todos os caracteres $
, \
e '
e deixe o shell fazer a expansão.
Ou se você não pode garantir que template
não contenha uma linha __end_of_template__
:
eval "cut -c2- << x
$(sed 's/[\$']/\&/g;s/<%= @\([^ ]*\) %>/${}/g;s/^/y/' < template)
x"