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


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 скрипт? Которые имеют более мощный / простой способ обработки строки.
Джон Сиу


Ответы:


5

Вероятно, существуют тысячи таких языков шаблонов и связанного программного обеспечения. Популярным примером является ERB , который является частью ванильного Ruby. После установки 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 macro IIRC).

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

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

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

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

2

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


Во-вторых, когда мне приходится выполнять такие операции по обработке текста, я беру Perl (но Python или Ruby должны работать одинаково хорошо). Лучше использовать обычный, часто используется инструмент , который хорошо (даже если не 100% подходит для работы) знать , чем специализированные программы редко используют (и которые рано или поздно будут падать вроде как - то).
vonbrand

2

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

С 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

Содержимое файла 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-шаблона.

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

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

Радоваться, веселиться!


1

Недавно я опубликовал проект с открытым исходным кодом, который выполняет это с использованием синтаксиса шаблона, похожего на jinja. Это называется 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.