2015-10-09 6 views
4

Я пытаюсь написать SED команды, чтобы заменить маркеры в файл со значениями из переменных окружения так:расширяющие переменные среды с SED

export my_var=foo 
echo 'something {{my_var}} bar' | sed -r "s/\{\{(.*?)\}\}/$\1/g" 

Я хочу, чтобы захватить имя маркера (my_var в этом случае), а затем замените значение переменной среды с тем же именем.

Возможно ли это? В приведенном выше отпечатке something $my_var bar, а не something foo bar, это то, что я хочу.

Я открыт для использования другого инструмента, такого как awk, если это невозможно с sed.

ответ

3

После замены {{my_var}} с $my_var, вам нужно отправить строку на секунду раунд замещения явно.

с eval

$ eval echo "$(echo 'something {{my_var}} bar' | sed 's/{{\([^}]\+\)}}/$\1/g')" 
something foo bar 

или субоболочкой

$ echo 'echo something {{my_var}} bar' | sed 's/{{\([^}]\+\)}}/$\1/g' | sh 
something foo bar 

Perl может сделать это 2-й раунд оценки по тексту замены только, а не весь выход (с e модификатором s/// функции в) :

$ echo 'something {{my_var}} bar' | perl -pe 's/\{\{(\w+)\}\}/$ENV{$1}/eg' 
something foo bar 
+0

Спасибо, пример Perl именно то, что я искал – toby

+0

Я также нашел [envsubst] (https://www.gnu.org/software/gettext/manual/html_node/envsubst- Invocation.html), он использует немного другой формат токена на входе, но имеет необходимую функциональность – toby

0

Если вы хотите использовать переменную, то добавьте $ sign перед переменной.

экспорт my_var = Foo

эхо "что-то {{$ my_var}} бар" | sed -r "s/{{(. *?)}}/$ \ 1/g" | СЕПГ 's | [$] || г'

выход:

что-то Foo бар

+0

Сближение, что дает me 'something $ foo bar' любые идеи о том, как удалить $ в результирующей строке? Формат в исходной строке может быть самым простым: – toby

+0

Проверьте это, теперь он работает хорошо и PLZ Replay – Nullpointer

+1

Спасибо, много, что работает, но я понимаю, что есть проблема с моим оригинальным примером - $ my_var заменяется на команда echo, а не sed, поэтому 'echo 'что-то {{$ my_var}} bar' | sed -r "s/\ {\ {(. *?) \} \}/$ \ 1/g" 'приводит к' something $$ my_var bar' и 'echo 'something {{$ my_var}} bar' | sed -r "s/\ {\ {(. *?) \} \}/$ \ 1/g" | sed 's | [$] || g'' приводит к 'something my_var bar' – toby