Вот способ сделать это без sed:
Во-первых, слегка измененный файл шаблона, в котором заполнителями являются переменные bash:
blah blah blah
blah $PLACEHOLDER_1
blah
$PLACEHOLDER_2
И сценарий:
#! /bin/sh
templatefile=output.template
outputfile=output.txt
PLACEHOLDER_1='string 1'
PLACEHOLDER_2='multiline
string
2'
# DONE: Generate file output.txt from file output.template
# using placeholders above.
echo "$(eval "echo \"$(cat $templatefile)\"")" > $outputfile
Вот версия, которая демонстрирует шаблон, содержащийся в скрипте, но с изюминкой. Он также демонстрирует значения по умолчанию, которые также могут быть использованы в версии файла шаблона, плюс вы можете выполнять математические операции в шаблоне:
#! /bin/sh
template='blah blah blah
blah $PLACEHOLDER_1
blah
${PLACEHOLDER_2:-"some text"} blah ${PLACEHOLDER_3:-"some
lines
of
text"} and the total is: $((${VAL_1:-0} + ${VAL_2:-0}))'
# default operands to zero (or 1) to prevent errors due to unset variables
outputfile=output.txt
# gears spin, bells ding, values for placeholders are computed
PLACEHOLDER_1='string 1'
PLACEHOLDER_2='multiline
string
2'
VAL_1=2
VAL_2=4
unset PLACEHOLDER_3 # so we can trigger one of the defaults
# Generate file output.txt from variable $template
# using placeholders above.
echo "$(eval "echo \"$template\"")" > $outputfile
Нет седа, нет петель, просто волосатое вложение и цитаты. Я почти уверен, что все цитаты защитят вас от вредоносных программ в файле шаблона, но я не собираюсь это гарантировать.