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

btshowmetainfo, раньше включенный в распределение БитТоррента, но теперь в основном установленный с BitTornado (ветвление БитТоррента 3.x кодовая база), делает просто это.

$ btshowmetainfo amd64cd-5.1.2.iso.torrent 
btshowmetainfo 20030621 - decode BitTorrent metainfo files

metainfo file.: amd64cd-5.1.2.iso.torrent
info hash.....: e30c05f2330ba4869eefb90bf5978a505303b235
file name.....: amd64cd-5.1.2.iso
file size.....: 253325312 (966 * 262144 + 94208)
announce url..: http://tracker.netbsd.org:6969/announce
9
29.12.2012, 00:36
6 ответов

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

require 'erb'

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

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

2
27.01.2020, 20:05
  • 1
    I ответа, второй это, когда я должен сделать такие текстовые операции порчи, я захватываю Perl (но Python или Ruby должны одинаково успеть). Лучше используйте постоянного клиента, очень используемый инструмент, который Вы знаете хорошо (даже если не 100%, подходящих для задания), чем специализированная программа, Вы редко используете (и который рано или поздно упадет вид так или иначе). –  vonbrand 04.03.2013, 15:46

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

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

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

Personnally у меня есть предпочтение xslt, но в Вашем случае, хотя это не соответствовало бы полям в форме %DATA1% %DATA2%. Этому нужен xml, таким образом, Вы не хотели бы изменить свои шаблоны.

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

  • Как другой выбор, мне сказали Haskell язык программирования действительно действительно хорош в преобразовании потоков. Я только рассматриваю эту идею, потому что возлюбленные Haskell говорят о wonderous Parsec пакет, который позволяет естественный парсинг строковых потоков. Намного лучше, чем xslt, который уже хорош. Я только повторяю их, потому что я просто изучаю Haskell, и у меня нет единственной идеи, как преобразовать текст с нею на данный момент.
5
27.01.2020, 20:05

Я не знаю, почему Вы делаете это, но у Вас есть два шаблона здесь. Каждый - Ваша 'база данных', и каждый - Ваш реальный шаблон. Обоих легко обработать с 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

Содержание 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 является первым необходимая 'база данных', сгенерированная от Вашего конфигурационного файла. И во-вторых для каждого кортежа в базе данных наконец соответствующий-Файл от Вашего В шаблоне.

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

Так, надейтесь, что это достаточно просто для Ваших потребностей.

Развлекайтесь!

2
27.01.2020, 20:05

Недавно я опубликовал проект с открытым исходным кодом, который выполняет именно это, используя синтаксис шаблона, подобный jinja -. Он называется cookie . Вот демо:

cookie demo

1
27.01.2020, 20:05

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

hello ${name}

, затем

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

Выход:

hello world
1
27.01.2020, 20:05

Теги

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