Инструмент для создания текстовых файлов из шаблона

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

У меня есть «база данных»:

# outputfile template data1 data2 data3 first.txt $template_main $text1 abcd 1234 second.txt $template_main $text2 efgh 5678 third.txt $template_other $text1 ij 90 

И файл конфигурации:

 template_main=main.txt template_other=other.txt text1=whatever text2=blah 

Шаблоны представляют собой текстовые файлы с заполнителями, такими как %% data2 %% (форма заполнителя может быть изменена).

Кто-нибудь знает инструмент для автоматизации этого лучше, чем со сложным сценарием оболочки?

4 Solutions collect form web for “Инструмент для создания текстовых файлов из шаблона”

Вы также можете рассмотреть:

  • инструмент GNU, называемый m4 который является текстовым процессором, который выводит текст, который вы хотите принимать, в качестве входных данных для шаблона с изменяемыми частями. Это, безусловно, будет проще, чем сценарий оболочки. (он работает больше или как препроцессор C с макросом #define IIRC).

  • инструмент GNU xsltproc который применяет преобразование и дает вам результат. Шаблон находится в xml , а xslt – это формат преобразований, который нужно сделать для вашего xml чтобы выводить текст.

Лично я предпочитаю xslt , но в вашем случае, хотя он не будет соответствовать полям в форме %DATA1% %DATA2% . Ему нужен xml, поэтому вам не хотелось бы менять свои шаблоны.

Таким образом, вы действительно должны взглянуть на m4 .

  • В качестве другого выбора мне сказали, что язык программирования Haskell действительно хорош в преобразовании потоков. Я рассматриваю эту идею только потому, что любители Haskell говорят о чудесном пакете Parsec , который позволяет естественный синтаксический анализ струнных потоков. Гораздо лучше, чем xslt, что уже хорошо. Я только повторяю их, потому что я просто изучаю Haskell, и у меня нет единой идеи, как преобразовать текст с ним на данный момент .

Есть, вероятно, тысячи таких языков шаблонов и сопутствующего программного обеспечения. Популярным примером является ERB , который является частью vanilla Ruby. После установки Ruby вы можете запустить irb или редактор и просто вставить канонический пример, чтобы почувствовать его:

 require 'erb' x = 42 template = ERB.new <<-EOF The value of x is: <%= x %> EOF puts template.result(binding) 

Я думаю, что вам будет лучше смотреть на настоящий язык сценариев, такой как PHP, Perl или Python, чтобы сделать что-то подобное для вас, особенно если вы действительно не хотите входить в крупномасштабные сложные сценарии оболочки.

Я не знаю, почему вы это делаете, но у вас есть два шаблона. Один из них – ваша «база данных», а один – ваш настоящий шаблон. Оба легко обрабатываются с помощью shtpl . (частный проект шахты, поэтому он не был широко использован, но был разработан для решения фактически таких проблем)

С помощью shtpl вы сделали бы что-то вроде этого:

Содержимое файла 'configuration':

 template_main=main.txt template_other=other.txt text1=whatever text2=blah 

Содержимое базы данных файла (я предположил, что разделителем является вкладка (\ t)):

 #% . "$CONFFile" #% if [ -z "$template_main" ] || [ -z "$template_other" ] || \ #% [ -z "$text1" ] || [ -z "$text2" ]; then #% printf "database could not be generated!\n" > /dev/stderr #% exit 1 #% fi #%# outputfile template data1 data2 data3 first.txt $template_main $text1 abcd 1234 second.txt $template_main $text2 efgh 5678 third.txt $template_other $text1 ij 90 

Содержимое generatetemplates.sh:

 #!/bin/bash if [ ! -s "$CONFFile" ]; then if [ ! -s "$1" ]; then printf "CONFfile is not set or empty!\n" exit 1 else export CONFFile="$1" fi fi DB="$( bash -c "$( shtpl database )" )" if [ -z "$DB" ]; then printf "Database is empty! Abort.\n" exit 2 fi IFS=$'\t' printf "%s" "$DB" | while read "Out" "In" "data1" "data2" "data3"; do data1="$data1" data2="$data2" data3="$data3" \ bash -c "$( shtpl "$In" )" > "$Out" done 

Содержимое main.txt (other.txt совершенно одинаково):

 main.txt template $data1 $data2 $data3 

Итак, выполнение generatetemplates.sh

 $ bash generatetemplates.sh "./configuration" 

генерирует нас first.txt, second.txt и third.txt.

 $ cat first.txt | $ cat second.txt | $ cat third.txt main.txt template | main.txt template | other.txt template whatever | blah | whatever abcd | efgh | ij 1234 | 5678 | 90 

Небольшое объяснение. В generatetemplates.sh сначала нужна «база данных», сгенерированная из вашего файла конфигурации. А во-вторых, для каждого tupel в базе данных, наконец, соответствующий Out-файл из вашего In-template.

Примечание: прочитаны пустые данные [123]. Поэтому с этим подходом это невозможно.

Поэтому, надеюсь, это достаточно просто для ваших нужд.

Повеселись!

  • Как тайм-аут по часам в Bash (и сохранить тайм-аут, даже если сессия была закрыта)?
  • Получить общую продолжительность видеофайлов в каталоге
  • grep до соответствия скобкам
  • Как сохранить один файл в каталоге?
  • Передача аргументов с пробелами и кавычками в скрипт (без цитирования всего)
  • (test -n $ st)! = (test -z $ st) право?
  • Использование переменной с awk -v в сценарии оболочки
  • Используя sshpass, код возврата (статус выхода) отличается по неизвестным причинам с использованием допустимых команд
  • Что такое «команда» на bash?
  • Как добавить дефисы в первую пустую строку текстового файла?
  • Извлечь только часть версии пакета с именем bash
  • Linux и Unix - лучшая ОС в мире.