टेम्प्लेट से टेक्स्ट फाइल बनाने का टूल


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 या पर्ल स्क्रिप्ट का प्रयास करें? जो स्ट्रिंग को संभालने के लिए अधिक शक्तिशाली / आसान तरीका है।
जॉन सियु


जवाबों:


5

इस तरह की टेम्प्लेट भाषाओं और संबद्ध सॉफ़्टवेयर में संभवतः हजारों हैं। एक लोकप्रिय उदाहरण ईआरबी है , जो वेनिला रूबी का हिस्सा है। रूबी को स्थापित करने के बाद आप शुरू कर सकते हैं irbया एक संपादक और बस इसे महसूस करने के लिए विहित उदाहरण पेस्ट करें:

require 'erb'

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

5

आप इस पर भी विचार कर सकते हैं:

  • GNU टूल को कहा जाता है m4जो एक टेक्स्ट प्रोसेसर है जो टेक्स्ट को आउटपुट देता है जिसे आप इनपुट के रूप में बदलना चाहते हैं ताकि भागों में बदलाव हो सके। यह निश्चित रूप से शेल स्क्रिप्ट की तुलना में सरल होगा। (यह #define मैक्रो IIRC के साथ C प्रीप्रोसेसर की तरह अधिक या काम करता है)।

  • GNU टूल xsltprocजो एक परिवर्तन को लागू करता है और आपको आउटपुट देता है। टेम्प्लेट में है xml, और xsltआपके द्वारा xmlटेक्स्ट को आउटपुट करने के लिए परिवर्तन करने वाली चीजों का प्रारूप है ।

व्यक्तिगत रूप से मेरे पास एक प्राथमिकता है xslt, लेकिन आपके मामले में हालांकि यह फॉर्म में फ़ील्ड के साथ फिट नहीं होगा %DATA1% %DATA2%। इसे xml की आवश्यकता है, इसलिए आप अपने टेम्प्लेट को बदलने से नफरत करेंगे।

इस प्रकार आपको वास्तव में एक नज़र रखना चाहिए m4

  • एक अन्य विकल्प के रूप में, मुझे बताया गया है कि Haskellप्रोग्रामिंग भाषा वास्तव में धाराओं को बदलने में बहुत अच्छी है। मैं केवल इस विचार पर विचार कर रहा हूं क्योंकि हास्केल प्रेमी अद्भुत Parsecपैकेज के बारे में बोलते हैं , जो स्ट्रिंग धाराओं के प्राकृतिक पार्सिंग की अनुमति देता है। Xslt से बहुत बेहतर है, जो पहले से ही अच्छा है। मैं केवल उन्हें दोहराता हूं, क्योंकि मैं सिर्फ हास्केल सीख रहा हूं, और मुझे अब तक इसके साथ पाठ को बदलने का एकमात्र विचार नहीं है

2

मुझे लगता है कि आप एक वास्तविक स्क्रिप्टिंग भाषा, जैसे PHP, पर्ल, या पायथन को देखने के लिए बेहतर होगा, आपके लिए ऐसा कुछ करना, खासकर यदि आप वास्तव में बड़े पैमाने पर जटिल शेल स्क्रिप्ट में नहीं आना चाहते हैं।


मैं यह दूसरा है, जब मुझे इस तरह के टेक्स्ट मूंगिंग ऑपरेशन करने होते हैं तो मैं पर्ल (लेकिन पायथन या रूबी को समान रूप से अच्छी तरह से करना चाहिए) को पकड़ो। बेहतर एक नियमित रूप से उपयोग किए जाने वाले उपकरण का उपयोग करें, जिसे आप अच्छी तरह से जानते हैं (भले ही नौकरी के लिए 100% अनुकूल न हो) एक विशेष कार्यक्रम की तुलना में जिसे आप शायद ही कभी उपयोग करते हैं (और जो जल्दी या बाद में किसी तरह गिर जाएगा )।
वॉनब्रांड

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

इसलिए जेनरेटेटेम्पलेट्स को क्रियान्वित करना

$ 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

थोड़ी व्याख्या: जेनेरेटेमैप्लेट्स में। आपके विन्यास-फाइल से उत्पन्न 'डेटाबेस' पहली जरूरत है। और दूसरी बात डेटाबेस में प्रत्येक टुपेल के लिए अंत में आपके इन-टेम्प्लेट से संबंधित आउट-फाइल।

नोट: एक खाली डेटा [123] परेशानियों को पढ़ता है। तो यह इस दृष्टिकोण के साथ संभव नहीं है।

तो, आशा है कि यह आपकी आवश्यकताओं के लिए पर्याप्त सरल है।

मज़े करो!


1

मैंने हाल ही में एक ओपन सोर्स प्रोजेक्ट प्रकाशित किया है, जो सिर्फ एक जिन्न-जैसे टेम्पलेट सिंटैक्स का उपयोग करता है। इसे कुकी कहा जाता है । यहाँ एक डेमो है:

कुकी डेमो


1

की जाँच करें tcat.sh । कहें कि आपके पास एक टेम्पलेट फ़ाइल है:

hello ${name}

फिर

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

आउटपुट:

hello world
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.