John Resig's Micro-Templating in 140 bytes (138 actually).
Please see John's original article for template syntax and more examples.
with (data){ ... }
implementation is longer, so the v
variable must be used to access the supplied data like this: <%= v.foo || 'No foo' %>
Is there a reason you use \n instead of another semicolon whithin the silent replacements (save 1 more byte)?
Also, you can save another byte by using recursive regex (which is allowed by the 140byt.es rules):