Alat untuk membuat file teks dari templat


9

Saya harus secara teratur membuat 100+ file teks dari template.
Saat ini saya menggunakan skrip shell yang terlalu rumit. Saya pikir ada cara yang lebih cerdas untuk menangani ini, tetapi saya tidak tahu caranya.

Saya memiliki "database":

# 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

Dan file konfigurasi:

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

Templat adalah file teks dengan placeholder seperti %% data2 %% (formulir placeholder dapat diubah).

Apakah ada yang tahu alat untuk mengotomatisasi ini lebih baik daripada dengan skrip shell yang rumit?


Sangat sulit untuk menilai apa yang rumit. Posting salah satunya akan membantu kita memahami situasinya. Mungkin mencoba skrip php atau perl? Yang memiliki cara lebih kuat / lebih mudah untuk menangani string.
John Siu


Jawaban:


5

Mungkin ada ribuan bahasa templat seperti itu dan perangkat lunak terkait. Contoh yang populer adalah ERB , yang merupakan bagian dari vanilla Ruby. Setelah menginstal Ruby, Anda dapat memulai irbatau mengedit dan cukup menempelkan contoh kanonik untuk merasakannya:

require 'erb'

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

5

Anda juga dapat mempertimbangkan:

  • alat GNU disebut m4yang merupakan pemroses teks yang menampilkan teks yang ingin Anda ambil sebagai masukan templat dengan bagian yang akan diubah. Itu pasti akan lebih sederhana daripada skrip shell. (berfungsi lebih atau seperti preprocessor C dengan #define macro IIRC).

  • alat GNU xsltprocyang menerapkan transformasi dan memberi Anda output. Template sudah ada xml, dan xsltmerupakan format transformasi yang harus dilakukan untuk Anda xmlsehingga untuk menghasilkan teks.

Secara pribadi saya memiliki preferensi untuk xslt, tetapi dalam kasus Anda meskipun tidak sesuai dengan bidang dalam formulir %DATA1% %DATA2%. Perlu xml, jadi Anda akan benci untuk mengubah template Anda.

Jadi Anda harus benar-benar melihatnya m4.

  • Sebagai pilihan lain, saya telah diberitahu bahwa Haskellbahasa pemrograman benar-benar bagus untuk mentransformasikan stream. Saya hanya mempertimbangkan ide ini karena pecinta Haskell berbicara tentang Parsecpaket luar biasa, yang memungkinkan penguraian alami aliran string. Jauh lebih baik daripada xslt, yang sudah bagus. Saya hanya mengulanginya, karena saya baru belajar Haskell, dan saya belum punya ide bagaimana mengubah teks dengannya untuk saat ini .

2

Saya pikir Anda akan lebih baik melihat bahasa scripting nyata, seperti PHP, Perl, atau Python, untuk melakukan sesuatu seperti ini untuk Anda, terutama jika Anda benar-benar tidak ingin masuk ke skrip shell skala besar yang kompleks.


Saya kedua ini, ketika saya harus melakukan operasi munging teks seperti itu saya ambil Perl (tapi Python atau Ruby harus melakukan hal yang sama baiknya). Lebih baik gunakan alat biasa yang sering Anda kenal dengan baik (bahkan jika tidak 100% cocok untuk pekerjaan itu) daripada program khusus yang jarang Anda gunakan (dan entah bagaimana cepat atau lambat akan jatuh semacam).
vonbrand

2

Saya tidak tahu mengapa Anda melakukan itu, tetapi Anda memiliki dua templat di sini. Satu adalah 'database' Anda dan satu adalah template asli Anda. Keduanya mudah ditangani dengan shtpl . (proyek pribadi saya, jadi tidak banyak digunakan, tetapi dikembangkan untuk menyelesaikan masalah-masalah semacam itu)

Dengan shtpl Anda akan melakukan sesuatu seperti ini:

Isi file 'konfigurasi':

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

Konten file 'database' (saya berasumsi, bahwa pembatas adalah tab (\ 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

Konten 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

Konten main.txt (other.txt hampir sama):

main.txt template
$data1
$data2
$data3

Jadi mengeksekusi generatetemplates.sh

$ bash generatetemplates.sh "./configuration"

menghasilkan kita first.txt, second.txt dan 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

Sedikit penjelasan: Pada generatetemplates.sh adalah yang pertama diperlukan 'database' yang dihasilkan dari file konfigurasi Anda. Dan yang kedua untuk setiap tupel dalam database akhirnya Out-file yang sesuai dari In-template Anda.

Catatan: Data kosong [123] sulit dibaca. Jadi tidak mungkin dengan pendekatan ini.

Jadi, harap ini cukup sederhana untuk kebutuhan Anda.

Selamat bersenang-senang!


1

Baru-baru ini saya menerbitkan proyek open source yang hanya menggunakan sintaksis template jinja-like. Ini disebut cookie . Ini demo:

demo cookie


1

Periksa tcat.sh . Katakanlah Anda memiliki file templat:

hello ${name}

kemudian

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

Keluaran:

hello world
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.