เครื่องมือในการสร้างไฟล์ข้อความจากแม่แบบ


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? ซึ่งมีวิธีที่มีประสิทธิภาพมากขึ้น / ง่ายต่อการจัดการสตริง
John Siu


คำตอบ:


5

อาจมีภาษาเทมเพลตและซอฟต์แวร์ที่เกี่ยวข้องหลายพันรายการ ตัวอย่างที่นิยมคือERBซึ่งเป็นส่วนหนึ่งของ Vanilla 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เพื่อส่งออกข้อความ

Personnally ฉันมีการตั้งค่าสำหรับแต่ในกรณีของคุณแม้ว่ามันจะไม่เหมาะสมกับสาขาในรูปแบบxslt %DATA1% %DATA2%จำเป็นต้องมี xml ดังนั้นคุณจึงไม่อยากเปลี่ยนแม่แบบของคุณ

ดังนั้นคุณควรดูm4จริง ๆ

  • อีกทางเลือกหนึ่งฉันได้รับการบอกว่าHaskellภาษาการเขียนโปรแกรมนั้นดีมากในการแปลงกระแสข้อมูล ฉันแค่พิจารณาความคิดนี้เพราะคนรักของ Haskell พูดถึงParsecแพ็คเกจสุดมหัศจรรย์ที่ทำให้สามารถแยกวิเคราะห์สายน้ำได้อย่างเป็นธรรมชาติ ดีกว่า xslt ซึ่งดีอยู่แล้ว ฉันเพียงซ้ำพวกเขาเพราะฉันเพิ่งเรียนรู้ Haskell และผมยังไม่ได้คิดเดียววิธีการแปลงข้อความที่มีในตอนนี้

2

ฉันคิดว่าคุณคงจะดีกว่าถ้าได้ดูภาษาสคริปต์จริงเช่น PHP, Perl หรือ Python เพื่อทำสิ่งนี้ให้คุณโดยเฉพาะอย่างยิ่งถ้าคุณไม่ต้องการเข้าไปในสคริปต์เชลล์ที่ซับซ้อนขนาดใหญ่


ฉันสองสิ่งนี้เมื่อฉันต้องทำข้อความดังกล่าวการดำเนินการ munging ฉันคว้า Perl (แต่ Python หรือ Ruby ควรทำอย่างเท่าเทียมกัน) ดีกว่าใช้เครื่องมือที่ใช้บ่อยๆที่คุณรู้จักดี (แม้ว่าจะไม่เหมาะกับงาน 100%) กว่าโปรแกรมพิเศษที่คุณไม่ค่อยใช้ (และไม่ช้าก็เร็วจะจัดเรียงอย่างใด)
vonbrand

2

ฉันไม่รู้ว่าทำไมคุณถึงทำแบบนั้น แต่คุณมีสองแม่แบบที่นี่ หนึ่งคือ 'ฐานข้อมูล' ของคุณและหนึ่งคือแม่แบบที่แท้จริงของคุณ ทั้งสองมีความง่ายต่อการจัดการกับ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"

สร้างเราเป็นครั้งแรก. 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-template ของคุณ

หมายเหตุ: ปัญหาในการอ่านข้อมูลเปล่า [123] ดังนั้นจึงเป็นไปไม่ได้ด้วยวิธีการนี้

ดังนั้นหวังว่ามันจะง่ายพอสำหรับความต้องการของคุณ

มีความสุข!


1

ฉันเพิ่งเผยแพร่โครงการโอเพนซอร์ซที่เพิ่งประสบความสำเร็จโดยใช้รูปแบบเทมเพลต jinja มันเรียกว่าคุกกี้ นี่คือตัวอย่าง:

การสาธิตคุกกี้


1

ตรวจสอบtcat.sh สมมติว่าคุณมีไฟล์เทมเพลต:

hello ${name}

แล้วก็

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

เอาท์พุท:

hello world
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.