Şablondan metin dosyaları oluşturma aracı


9

Şablonlardan düzenli olarak 100'den fazla metin dosyası oluşturmam gerekiyor.
Şu anda aşırı karmaşık bir kabuk komut dosyası kullanıyorum. Bunun üstesinden gelmek için daha akıllı bir yol olduğunu düşünüyorum, ama nasıl yapacağımı bilmiyorum.

Bir "veritabanı" var:

# 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

Ve bir yapılandırma dosyası:

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

Şablonlar, %% data2 %% gibi yer tutucuları olan metin dosyalarıdır (yer tutucu formu değiştirilebilir).

Birisi bunu karmaşık bir kabuk betiğinden daha iyi otomatikleştirmek için bir araç biliyor mu?


Neyin karmaşık olduğunu yargılamak çok zor. Bunlardan birini yayınlamak durumu anlamamıza yardımcı olacaktır. Belki php veya perl betiğini deneyin? Dize işlemek için daha güçlü / kolay yolu var.
John Siu


Yanıtlar:


5

Muhtemelen binlerce şablon dili ve ilgili yazılım vardır. Popüler bir örnektir ERB vanilya Ruby parçasıdır. Ruby'yi yükledikten sonra, irbbir düzenleyici başlatabilir ve bunu hissetmek için kanonik örneği yapıştırabilirsiniz:

require 'erb'

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

5

Ayrıca şunları da düşünebilirsiniz:

  • denilen GNU aracı m4, değiştirmek istediğiniz metni çıktı alan bir metin işlemcisidir. Kabuk betiğinden kesinlikle daha basit olurdu. (daha çok veya #define macro IIRC içeren bir C önişlemcisi gibi çalışır).

  • xsltprocbir dönüşüm uygulayan ve çıktıyı veren GNU aracı . Şablon içerisindedir xmlve metin çıktısı xsltalmak için, yapacağınız dönüştürme işlemlerinin biçimidir xml.

Şahsen bir tercihim var xslt, ancak sizin durumunuzda formdaki alanlara uymuyor olsa da %DATA1% %DATA2%. Xml'ye ihtiyaç duyduğundan şablonlarınızı değiştirmek istemezsiniz.

Böylece gerçekten bir göz atmalısınız m4.

  • Başka bir seçenek olarak, Haskellprogramlama dilinin akışları dönüştürmede gerçekten çok iyi olduğu söylendi . Ben sadece bu fikri düşünüyorum çünkü Haskell severler Parsecdize akışlarının doğal ayrıştırılmasına izin veren harika paket hakkında konuşuyorlar . Zaten iyi olan xslt'den çok daha iyi. Onları sadece tekrarlıyorum, çünkü sadece Haskell'i öğreniyorum ve şimdilik metni nasıl dönüştüreceğime dair tek bir fikrim yok .

2

Özellikle büyük ölçekli karmaşık kabuk betiklerine girmek istemiyorsanız, sizin için böyle bir şey yapmak için PHP, Perl veya Python gibi gerçek bir betik diline bakmanın daha iyi olacağını düşünüyorum.


Ben ikinci olarak, böyle metin munging işlemleri yapmak zorunda kaldığında Perl kapmak (ama Python veya Ruby eşit derecede iyi yapmak gerekir). Nadiren kullandığınız (ve er ya da geç bir şekilde düşecek) özel bir programdan daha iyi bildiğiniz düzenli, çok kullanılan bir aracı (işe% 100 uygun olmasa bile) daha iyi kullanın .
vonbrand

2

Bunu neden yaptığını bilmiyorum, ama burada iki şablonun var. Biri sizin 'veritabanınız', diğeri ise gerçek şablonunuz. Her ikisi de shtpl ile kullanımı kolaydır . (benim özel proje, bu yüzden yaygın kullanımda değil, ama aslında bu tür sorunları çözmek için geliştirilmiştir)

Shtpl ile böyle bir şey yapardınız:

'Configuration' dosyasının içeriği:

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

'Veritabanı' dosyasının içeriği (Sınırlayıcının sekme olduğunu varsaydım (\ 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 içeriği:

#!/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 içeriği (other.txt aynıdır):

main.txt template
$data1
$data2
$data3

Yani generatetemplates.sh yürütmek

$ bash generatetemplates.sh "./configuration"

bize first.txt, second.txt ve third.txt dosyalarını üretir.

$ 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

Küçük açıklama: generatetemplates.sh içinde ilk olarak yapılandırma dosyanızdan oluşturulan 'veritabanı' gereklidir. İkincisi, veritabanındaki her tupel için nihayet In-şablonunuzdaki karşılık gelen Out-file.

Not: Boş bir veri [123] okunan sorunları. Dolayısıyla bu yaklaşımla mümkün değil.

Yani, umarım bu ihtiyaçlarınız için yeterince basittir.

İyi eğlenceler!


1

Geçenlerde bir jinja benzeri şablon sözdizimi kullanarak bunu başarmak için açık kaynak kodlu bir proje yayınladım. Buna çerez denir . İşte bir demo:

çerez demosu


1

Tcat.sh sayfasına göz atın . Bir şablon dosyanız olduğunu varsayalım:

hello ${name}

sonra

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

Çıktı:

hello world
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.