Search code examples
bashcommand-linetext-processingtemplating

How to replace ${} placeholders in a text file?


I want to pipe the output of a "template" file into MySQL, the file having variables like ${dbName} interspersed. What is the command line utility to replace these instances and dump the output to standard output?

The input file is considered to be safe, but faulty substitution definitions could exist. Performing the replacement should avoid performing unintended code execution.


Solution

  • Update: Try envsubst

    Here is a solution from yottatsa on a similar question that only does replacement for variables like $VAR or ${VAR}, and is a brief one-liner

    i=32 word=foo envsubst < template.txt
    

    Of course if i and word are in your environment, then it is just

    envsubst < template.txt
    

    On my Mac it looks like it was installed as part of gettext and from MacGPG2

    Old Answer: Try eval

    Here is an improvement to the solution from mogsie on a similar question, my solution does not require you to escape double quotes, mogsie's does, but his is a one liner!

    eval "cat <<EOF
    $(<template.txt)
    EOF
    " 2> /dev/null
    

    The power on these two solutions is that you only get a few types of shell expansions that don't occur normally $((...)), `...`, and $(...), though backslash is an escape character here, but you don't have to worry that the parsing has a bug, and it does multiple lines just fine.