Я хочу направить вывод файла «шаблона» в MySQL, файл, имеющий переменные, такие как ${dbName}
вкрапленные. Что такое утилита командной строки для замены этих экземпляров и вывода вывода на стандартный вывод?
bash
command-line
text-processing
templating
Дана вменяемая
источник
источник
cat
. Все, что вам нужно, этоsed -e "s/\${i}/1/" -e "s/\${word}/dog/" template.text
.sed
будет ожидать экранированный текст, который является проблемой.Обновить
Вот решение от yottatsa по аналогичному вопросу, которое выполняет замену только таких переменных, как $ VAR или $ {VAR}, и является кратким однострочником
Конечно, если я и слово в вашей среде, то это просто
На моем Mac похоже, что он был установлен как часть gettext и из MacGPG2
Старый ответ
Вот улучшение решения от mogsie по аналогичному вопросу, мое решение не требует от вас эскалирования двойных кавычек, это делает mogsie, но он - один лайнер!
Сила этих двух решений является то , что вы получите только несколько типов расширений оболочки , которые не встречаются обычно $ ((...)), `...` и $ (...), хотя обратный слэш является здесь есть экранирующий символ, но вам не нужно беспокоиться о том, что при разборе есть ошибка, и он отлично справляется с несколькими строками.
источник
envsubst
не работает, если ваши envars не экспортируются.envsubst
Как следует из названия, он распознает только переменные окружения , а не переменные оболочки . Стоит также отметить, чтоenvsubst
это утилита GNU , поэтому она не предустановлена и не доступна на всех платформах.Использование
/bin/sh
. Создайте небольшой скрипт оболочки, который устанавливает переменные, а затем проанализируйте шаблон с помощью самой оболочки. Вот так (отредактируйте, чтобы правильно обрабатывать новые строки):Файл template.txt:
Файл script.sh:
Вывод:
источник
bash
команды на входе будут выполнены. Если шаблон: «the words is; rm -rf $ HOME», вы потеряете файлы.read
команда, как написано, обрезает начальные и конечные пробелы в каждой строке и «ест»\
символы. (В) используйте это, только если вы полностью доверять или контролировать ввод, потому что подстановки команд (`…`
или$(…)
), встроенные во ввод, позволяют выполнять произвольные команды из-за использованияeval
. Наконец, есть небольшая вероятность того, чтоecho
в начале строки будет указан один из параметров командной строки.Я снова думал об этом, учитывая недавний интерес, и я думаю, что инструмент, о котором я первоначально думал, был
m4
, макропроцессор для автоинструментов. Таким образом, вместо переменной, которую я первоначально указал, вы должны использовать:источник
envsubst
эту простую замену / использование шаблонов, как упоминалось в других ответах.m4
Это отличный инструмент, но это полноценный препроцессор с гораздо большим количеством функций и, следовательно, сложностью, которая может не потребоваться, если вы просто хотите заменить некоторые переменные.template.txt
data.sh
parser.sh
parsed_file.txt
источник
`…`
или$(…)
), встроенные во ввод, позволяют выполнять произвольные команды из-за использованияeval
и непосредственное выполнение кода оболочки из-за использованияsource
. Кроме того, двойные кавычки во входных данных незаметно отбрасываются, и ониecho
могут ошибочно принять начало строки за один из параметров командной строки.Вот надежная функция Bash, которая, несмотря на использование
eval
следует использовать безопасно.Все
${varName}
ссылки на переменные во входном тексте расширяются на основе переменных вызывающей оболочки.Больше ничего не раскрывается: ни ссылки на переменные, имена которых не заключены в
{...}
(такие как$varName
), ни подстановки команд ($(...)
и устаревший синтаксис`...`
), ни арифметические подстановки ($((...))
и устаревший синтаксис$[...]
).Для того, чтобы лечить ,
$
как буквальные,\
экранирующий его; например:\${HOME}
Обратите внимание, что ввод принимается только через стандартный ввод .
Пример:
Исходный код функции:
Функция не предполагает , что нет
0x1
,0x2
,0x3
, и0x4
управляющие символы присутствуют на входе, потому что эти символы. используются внутренне - так как функция обрабатывает текст , это должно быть безопасным допущением.источник
eval
это довольно безопасно для использования."
правильно убегая !)${FOO:-bar}
указать значения по умолчанию для отсутствующих переменных или вывести что-то, только если оно установлено -${HOME+Home is ${HOME}}
. Я подозреваю, что с небольшим расширением он может также возвращать коды завершения для отсутствующих переменных,${FOO?Foo is missing}
но в настоящее время tldp.org/LDP/abs/html/parameter-substitution.html не содержит их список, если это поможетСоздать
rendertemplate.sh
:И
template.tmpl
:Визуализируйте шаблон:
источник
$(rm -rf ~)
, вы запускаете это как код.eval "echo \"$(cat $1)\""
Прекрасно работает !Вот мое решение с Perl на основе предыдущего ответа, заменяет переменные среды:
источник
Если вы открыты для использования Perl , это мое предложение. Хотя, вероятно, есть некоторые специалисты по sed и / или AWK, которые, вероятно, знают, как сделать это намного проще. Если у вас есть более сложное сопоставление с заменой dbName для замен, вы можете довольно легко расширить это, но вы можете с таким же успехом поместить его в стандартный сценарий Perl на этом этапе.
Короткий Perl-скрипт для создания чего-то более сложного (обработка нескольких ключей):
Если вы называете вышеуказанный скрипт как replace-script, он может быть использован следующим образом:
источник
Вот способ заставить оболочку выполнить за вас замену, как если бы содержимое файла вместо этого было заключено в двойные кавычки.
Используя пример template.txt с содержимым:
Следующая строка заставит оболочку интерполировать содержимое template.txt и записать результат в стандартный формат.
Объяснение:
i
иword
передаются как переменные среды, ограниченные для выполненияsh
.sh
выполняет содержимое строки, которую он передал.echo "
' + "$(cat template.txt)
" + '"
'"
, "$(cat template.txt)
" становится выходомcat template.txt
.sh -c
становится:echo "The number is ${i}\nThe word is ${word}"
,i
иword
- указанные переменные среды.источник
'$(rm -rf ~)'$(rm -rf ~)
буквенные кавычки в файле шаблона, они будут соответствовать тем, которые вы добавили перед его расширением.'$(echo a)'$(echo a)
. Это производит'a'a
. Главное, что происходит, - это то,echo a
что'
вычисляется первое внутри , что может не соответствовать ожидаемому, поскольку оно внутри'
, но такое же поведение, как и включение'
в"
строку в кавычках."
строка в кавычках (включая$(...)
) - это точка.${varname}
, а не другие, более рискованные расширения безопасности.echo "
разделяетесь на строку в одинарных кавычках , за которой следует строка в двойных кавычках с литеральными контекстамиtemplate.txt
, а затем другая литеральная строка"
, все из которых объединяются в один передаваемый аргументsh -c
. Вы правы, что'
не может быть сопоставлено (поскольку оно было использовано внешней оболочкой, а не передано внутренней), но,"
безусловно, может, так что шаблон, содержащий,Gotcha"; rm -rf ~; echo "
может быть выполнен.file.tpl:
script.sh:
источник
\$(date)
while IFS= read -r line; do
в качествеread
команды, в противном случае вы удалите начальные и конечные пробелы из каждой строки ввода. Кроме того,echo
может ошибочно принять начало строки за один из параметров командной строки, поэтому лучше использоватьprintf '%s\n'
. Наконец, безопаснее двойные кавычки${1}
.Я бы предложил использовать что-то вроде Sigil : https://github.com/gliderlabs/sigil
Он скомпилирован в один двоичный файл, поэтому его очень легко установить в системах.
Тогда вы можете сделать простой однострочник, как показано ниже:
Это гораздо безопаснее, чем
eval
с помощью регулярных выражений илиsed
источник
cat
и использовать<my-file.conf.template
вместо этого, чтобы вы далиsigil
реальный дескриптор файла вместо FIFO.Я нашел эту тему, хотя удивляюсь тому же самому. Это вдохновило меня на это (осторожно с галочкой)
источник
$(cat file)
это$(< file)
eval echo "\"$(cat FILE)\""
но это может все еще не соответствовать тому, что двойные кавычки во входных данных отбрасываются.`…`
или$(…)
), встроенные во вход, позволяют выполнять произвольные команды из-за использованияeval
.Здесь много вариантов, но я решил бросить свой в кучу. Это основано на Perl, только целевые переменные вида $ {...}, принимает файл для обработки в качестве аргумента и выводит преобразованный файл на стандартный вывод:
Конечно, я на самом деле не Perl человек, поэтому легко может быть фатальный недостаток (работает для меня, хотя).
источник
Env::import();
строку - импорт подразумеваетсяuse
. Кроме того, я предлагаю не создавать сначала весь вывод в памяти: просто используйтеprint;
вместо$text .= $_;
цикла и удалите команду post-loopprint
.Это можно сделать в самом bash, если у вас есть контроль над форматом файла конфигурации. Вам просто нужно найти (".") Файл конфигурации, а не его оболочку. Это гарантирует, что переменные создаются в контексте текущей оболочки (и продолжают существовать), а не подоболочки (где переменная исчезает при выходе из подоболочки).
Если ваш конфигурационный файл не может быть сценарием оболочки, вы можете просто «скомпилировать» его перед выполнением (компиляция зависит от вашего формата ввода).
В вашем конкретном случае вы можете использовать что-то вроде:
Затем перенаправьте вывод go.bash в MySQL и вуаля, надеюсь, вы не уничтожите свою базу данных :-).
источник
go.bash
), у вас неправильный конец - они не являются частью решения, они просто показывают, что переменные установить правильно.Вместо Perl редактирование потенциально нескольких файлов с резервными копиями.
источник
Вы захотите что-то более надежное, чем текущие предложения, потому что, хотя они работают для вашего (на данный момент) варианта ограниченного использования, их будет недостаточно для более сложных ситуаций.
Вам нужен лучший рендер. Вам нужен лучший рендер. Вам нужен Renderest!
Данный шаблон.txt:
Здравствуйте, {{person}}!
Бегать:
$ person = Bob ./render template.txt
И вы увидите выход
Привет, Боб!
Запишите его в файл, перенаправив стандартный вывод в файл:
$ person = Bob ./render template.txt> rendered.txt
И если вам случится рендерить скрипт, в котором есть переменные $ {}, которые вы не хотите интерполировать, Renderest поможет вам без необходимости делать что-либо еще!
Продолжайте и получите свою копию на https://github.com/relaxdiego/renderest
источник