Заполните заполнителей в файле в единственной передаче

Свойства, оцениваемые с помощью синтаксиса {{property}}, разрешаются только один раз во время инициализации контекста. Если вам нужно отразить изменения во время выполнения, используйте Простой язык

Пример:




    
    
    




    
        
        
        
        
    

6
задан Alexander Gladysh 2 January 2009 в 16:11
поделиться

3 ответа

Можно все еще использовать sed, чтобы сделать замену в единственной передаче. Просто необходимо указать все замены в одной команде.

например.

sed -i 's/PLACEHOLDER_1/string 1/g;s/PLACEHOLDER_2/string 2/g' <file>
9
ответ дан 8 December 2019 в 03:40
поделиться

При построении на предыдущем ответе, возможно, используйте массив и вычислите строку sed?

#!/bin/sh
PLACEHOLDER[0]='string 1'
PLACEHOLDER[1]='multiline 
string 
2'

s="sed -i "
for(( i=0 ; i<${#PLACEHOLDER[*]} ; i++ )) ; do 
    echo ${PLACEHOLDER[$i]}
    s=$s"s/PLACEHOLDER_$i/${PLACEHOLDER[$i]}/g;"
done
echo $s

Кажется, перестал работать на многострочных строках, все же.

Я не знаю, как портативные массивы Bash могли бы быть. Выше отрывка, протестированного с "ударом GNU, версией 3.2.17 (1) - выпуск (i386-apple-darwin9.0)"

5
ответ дан 8 December 2019 в 03:40
поделиться

Одно свойство этого подхода, на которое до сих пор не указывалось, заключается в том, что поскольку вы создаете внутренние классы, весь содержащий класс захватывается в его области видимости. Это означает, что пока ваш Set жив, он будет сохранять указатель на содержащий экземпляр ( this $ 0 ) и предохранять его от сбора мусора, что может быть проблемой.

Это, и тот факт, что в первую очередь создается новый класс, даже если обычный HashSet будет работать нормально (или даже лучше), заставляет меня не использовать эту конструкцию (хотя я очень хочу синтаксического сахара).

Второй вопрос: новый HashSet должен быть «this», используемым в инициализаторе экземпляра ... может ли кто-нибудь пролить свет на механизм? Я бы наивно ожидал, что "this" будет относиться к инициализирующему объекту " который также можно использовать в версии файла шаблона, плюс вы можете выполнять математические вычисления в шаблоне:

#! /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

Никаких sed, никаких циклов, только волосатое вложение и кавычки. Я почти уверен, что все цитаты защитят вас от вредоносных файлов в файле шаблона, но я не собираюсь этого гарантировать.

11
ответ дан 8 December 2019 в 03:40
поделиться
Другие вопросы по тегам:

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