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


9

Мені потрібно регулярно створювати 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 %% (форму заповнення можна змінити).

Хтось знає інструмент для автоматизації цього краще, ніж зі складним сценарієм оболонки?


Дуже складно судити про те, що складне. Опублікування одного з них допоможе нам зрозуміти ситуацію. Можливо, спробуйте php або perl script? Які мають більш потужний / простіший спосіб обробляти струни.
Джон Сіу


Відповіді:


5

Мабуть, тисячі таких мов шаблонів та пов'язаного програмного забезпечення. Популярний приклад - ERB , що входить до складу ванілі Рубі. Після встановлення Ruby ви можете запустити irbредактор або просто вставити канонічний приклад, щоб відчути це:

require 'erb'

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

5

Ви також можете врахувати:

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

  • інструмент GNU, xsltprocякий застосовує перетворення і дає результат. Шаблон є xml, і xsltце формат перетворення, який потрібно зробити вашому xml, щоб вивести текст.

Особисто я маю перевагу xslt, але у вашому випадку, хоч це не вписується у поля у формі %DATA1% %DATA2%. Для цього потрібно xml, тож вам би не хотілося змінювати свої шаблони.

Таким чином, ви повинні дійсно подивитися m4.

  • Як інший вибір, мені сказали, що Haskellмова програмування дійсно добре перетворює потоки. Я розглядаю цю ідею лише тому, що любителі Haskell говорять про чудовий Parsecпакет, який дозволяє природний аналіз струнних потоків. Набагато краще, ніж xslt, що вже добре. Я лише повторюю їх, тому що я просто вивчаю Haskell, і я не маю єдиної ідеї, як перетворити текст за допомогою нього .

2

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


По-друге, це, коли мені доводиться виконувати такі операції з редагування тексту, я захоплюю Perl (але Python або Ruby повинні робити однаково добре). Краще використовувати звичайний, часто використовується інструмент , який добре (навіть якщо не 100% підходить для роботи) знати , чим спеціалізовані програми рідко використовують (і які рано чи пізно будуть падати ніби як - то).
vonbrand

2

Я не знаю, чому ви так робите, але у вас є два шаблони. Один - це ваша «база даних», а один - ваш реальний шаблон. Обидва легко обробляти shtpl . (мій приватний проект, настільки широко не використовується, але був розроблений для вирішення таких проблем)

З shtpl ви зробите щось подібне:

Вміст файлу "конфігурація":

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

Вміст generatortemplates.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

Отже, виконайте generatortemplates.sh

$ bash generatetemplates.sh "./configuration"

генерує нам перший.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

Невелике пояснення: в createtemplates.sh спочатку потрібна 'база даних', створена з вашого конфігураційного файлу. І по-друге, для кожного тупеля в базі даних, нарешті, відповідний Out-файл із вашого In-template.

Примітка. Проблеми зчитування порожніх даних [123]. Тож неможливо при такому підході.

Тож сподіваємось, що це досить просто для ваших потреб.

Веселіться!


1

Нещодавно я опублікував проект з відкритим кодом, який виконує саме те, використовуючи синтаксис шаблону, подібного до jinja. Це називається cookie . Ось демонстрація:

демонстрація файлів cookie


1

Перевірте tcat.sh . Скажіть, у вас є файл шаблону:

hello ${name}

тоді

$ export name=world # or load and export from a properties file.
$ ./tcat.sh template-file

Вихід:

hello world
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.