Вот как это сделать в bash. Вам нужна последняя версия, потому что здесь я полагаюсь на ассоциативные массивы
template=$(cat << 'END_TEMPLATE'
I have some
text with ${placeholders}
in this and some ${different}
ones ${here} and ${there}
END_TEMPLATE
)
mapfile -t placeholders < <(grep -Po '(?<=\$\{).+?(?=\})' <<< "$template" | sort -u)
declare -A data
for key in "${placeholders[@]}"; do
read -p "Enter the '$key' value: " -r data[$key]
done
t=$template
while [[ $t =~ '${'([[:alnum:]_]+)'}' ]]; do
t=${t//"${BASH_REMATCH[0]}"/"${data[${BASH_REMATCH[1]}]}"}
# ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# | + the value the user entered
# + the placeholder in the text
done
echo "$t"
Я помещаю эти два варианта в качестве ответов, хотя они на самом деле не отвечают на вопрос (ответ "в bash, нет" )на случай, если кто-то увидит это, и чтобы показать метод замены stdout и stderr и правильное форматирование (в отличие от комментариев ).
Ответьте один :предположим, что это программа, которую вы хотите запустить (Я знаю, что это не похоже на команду, но притворяюсь, что это так; замените все на команду и аргументы, которые вы действительно хотите запустить):
{ echo stdout; echo stderr >&2; }
Теперь предположим, что вы хотите найти что-то только в stderr, но оставить stdout как есть -.
{ echo stdout; echo stderr >&2; } 2> >(grep something)
Если это все, что вы сделали, вы получите весь stdout и части stderr, в которых что-то есть, все вперемежку. Вы можете записать stdout и stderr в отдельные файлы для последующего просмотра :
.{ echo stdout; echo stderr >&2; } 2> >(grep something > errorfile) > outputfile
Об обмене stdout и stderr (и о том, почему вы хотите это сделать ), см.https://stackoverflow.com/questions/13299317/io-redirection-swapping-stdout-and-stderrдля лучшего объяснения, чем я могу дать.