Замените заполнителями в шаблоне

Вы могли использовать несколько 'регионов' в screen:

$ cat screenrc.sql
escape ^aa  # adjust as needed
bind q quit # to quickly exit
screen 0 less ${FILE}
screen 1 less ${FILE}
split  # create two regions
focus top # starting with the top region
resize 4  # make it four lines (one for screen line, one for less prompt)
select 0  # display window 0
focus bottom  # in the bottom region
select 1  # display window 1 and focus here

Затем просто необходимо установить переменную среды $FILE:

$ FILE=$HOME/.bash_profile screen -mc screenrc.sql
4
06.12.2012, 13:24
4 ответа

Вы могли сделать что-то как:

eval "cat << __end_of_template__
$(sed 's/[\$`]/\\&/g;s/<%= @\([^ ]*\) %>/${\1}/g' < template)
__end_of_template__"

Таким образом, имейте замену sed весь <%= @xxx %> с ${xxx} выйдя весь $, \ и ` символы и позволяют оболочке сделать расширение.

Или если Вы не можете гарантировать это template не будет содержать a __end_of_template__ строка:

eval "cut -c2- << x
$(sed 's/[\$`]/\\&/g;s/<%= @\([^ ]*\) %>/${\1}/g;s/^/y/' < template)
x"
4
27.01.2020, 20:50

awk путь:

awk -F= 'FNR==NR{v[$1]=$2;next};{for(p in v)gsub("<%= @"p" %>",v[p])};1' config template

Обновленный согласно комментарию Stephane Chazelas для разрешения “=” входит в систему значения:

awk -F= 'FNR==NR{v[$1]=substr($0,length($1)+2);next};{for(p in v)gsub("<%= @"p" %>",v[p])};1' config template
3
27.01.2020, 20:50
  • 1
    Обратите внимание, что это предполагает, что значение параметров не содержит "=" символы или название другого параметра (как FOO="<%= @BAR %>") –  Stéphane Chazelas 06.12.2012, 15:33

Односторонняя дорога:

#!/bin/sh

. config

while read line
do
        eval echo $(echo $line | sed "s/\([^<]*\)<%= @\([^ ]*\) %>/\1 \$\2/")
done < template

Результаты:

The host is localhost
The port is 8080

Используя sed, мы извлекаем символы до' <' и формируем группу (\1), и извлечение заполнитель и форма другая группа (\2). Этим заменяют с 1-й группой и затем долларовым символом, сопровождаемым 2-й группой. Только при помощи eval команда, переменная может быть оценена и расширена.

-1
27.01.2020, 20:50
  • 1
    , содержащие специальные символы оболочки, будут серьезно искажены и могут заставить Ваш сценарий выполнять произвольный код. Если вход прибывает из ненадежного источника, это - явная дыра в системе безопасности. Необходимо сделать некоторое серьезное заключение в кавычки и выход для создания этой работы. (См. ответ Stephane Chazelas для примера того, как сделать его правильно.) –  Gilles 'SO- stop being evil' 07.12.2012, 01:11

Вы можете использовать mustache(1) для замены кучи переменных шаблона:

$ { echo ---; sed 's/=/: /' config; echo --- } \
  | mustache - <(sed -e 's/<%= @/{{/g' -e 's/%>/}}/g' template)

Первый элемент трубы переводит ваши конфигурационные назначения в синтаксис YAML, который понимает мой mustache. Вторая команда sed заменяет ссылки на переменные стиля <%= @VAR %> на переменные mustache {{ VAR }}.

На Fedora, mustache является частью пакета rubygem-mustache.

В качестве альтернативы вы можете использовать envsubst (предоставляется пакетом gettext), например:

$ ( export $(cat config) ; sed -e 's/<%= @\([^%]*\) %>/${\1}/g' template 
  | envsubst )

Требуется, чтобы ваши назначения переменных были действительны и в оболочке.

3
27.01.2020, 20:50

Теги

Похожие вопросы