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
Существуют, вероятно, тысячи таких шаблонных языков и связанного программного обеспечения. Популярным примером является ERB, который является частью ванильного 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, чтобы сделать что-то вроде этого для Вас, особенно если Вы действительно не хотите входить в крупномасштабные сложные сценарии оболочки.
Вы могли также рассмотреть:
инструмент GNU называют m4
который является текстовым процессором, которые производят текст, Вы хотите брать в качестве исходных данных шаблон с частями для изменения. Это, конечно, было бы более просто, чем сценарий оболочки. (это работает больше или как препроцессор C с #define макро-IIRC).
инструмент GNU xsltproc
это применяет преобразование и дает Вам вывод. Шаблон находится в xml
, и xslt
формат вещей преобразования сделать к Вашему xml
чтобы к синтезируемому тексту.
Personnally у меня есть предпочтение xslt
, но в Вашем случае, хотя это не соответствовало бы полям в форме %DATA1%
%DATA2%
. Этому нужен xml, таким образом, Вы не хотели бы изменить свои шаблоны.
Таким образом необходимо действительно взглянуть на m4
.
Haskell
язык программирования действительно действительно хорош в преобразовании потоков. Я только рассматриваю эту идею, потому что возлюбленные Haskell говорят о wonderous Parsec
пакет, который позволяет естественный парсинг строковых потоков. Намного лучше, чем xslt, который уже хорош. Я только повторяю их, потому что я просто изучаю Haskell, и у меня нет единственной идеи, как преобразовать текст с нею на данный момент.Я не знаю, почему Вы делаете это, но у Вас есть два шаблона здесь. Каждый - Ваша 'база данных', и каждый - Ваш реальный шаблон. Обоих легко обработать с 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] чтение проблем. Таким образом, это не возможно с этим подходом.
Так, надейтесь, что это достаточно просто для Ваших потребностей.
Развлекайтесь!