Narzędzie do tworzenia plików tekstowych z szablonu

9

Muszę regularnie tworzyć ponad 100 plików tekstowych z szablonów.
Obecnie używam zbyt skomplikowanego skryptu powłoki. Myślę, że jest mądrzejszy sposób na poradzenie sobie z tym, ale nie wiem jak.

Mam „bazę danych”:

# 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

I plik konfiguracyjny:

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

Szablony to pliki tekstowe z symbolami zastępczymi, takimi jak %% data2 %% (formularz zastępczy można zmienić).

Czy ktoś zna narzędzie do automatyzacji tego lepiej niż skomplikowany skrypt powłoki?

Gregory MOUSSAT
źródło
Bardzo trudno jest ocenić, co jest skomplikowane. Opublikowanie jednego z nich pomoże nam zrozumieć sytuację. Może spróbuj skryptu php lub perl? Które mają mocniejszy / łatwiejszy sposób obsługi ciągów.
John Siu,
1
Możliwy duplikat
10b0 28.12.12

Odpowiedzi:

5

Prawdopodobnie istnieją tysiące takich języków szablonów i powiązanego oprogramowania. Popularnym przykładem jest ERB , który jest częścią waniliowego Ruby. Po zainstalowaniu Ruby możesz uruchomić irblub edytor i po prostu wkleić kanoniczny przykład, aby się zorientować:

require 'erb'

x = 42
template = ERB.new <<-EOF
  The value of x is: <%= x %>
EOF
puts template.result(binding)
l0b0
źródło
5

Możesz również rozważyć:

  • zwane narzędziem GNU, m4które jest procesorem tekstowym, który wypisuje tekst, który chcesz pobrać jako szablon szablonu, którego części chcesz zmienić. Z pewnością byłoby to prostsze niż skrypt powłoki. (działa więcej lub przypomina preprocesor C z makrem #define IIRC).

  • narzędzie GNU, xsltprocktóre stosuje transformację i daje wynik. Szablon jest xml, i xsltto jest format z rzeczy do zrobienia transformacji do xmltak do tekstu wyjściowego.

Osobiście preferuję xslt, ale w twoim przypadku nie pasowałoby to do pól w formularzu %DATA1% %DATA2%. Wymaga xml, więc nie chciałbyś zmieniać swoich szablonów.

Dlatego naprawdę powinieneś rzucić okiem m4.

  • Jako kolejny wybór, powiedziano mi, że Haskelljęzyk programowania jest naprawdę dobry w przekształcaniu strumieni. Zastanawiam się tylko nad tym pomysłem, ponieważ miłośnicy Haskell mówią o cudownym Parsecpakiecie, który umożliwia naturalne analizowanie strumieni struny. Znacznie lepiej niż xslt, który jest już dobry. Powtarzam je tylko, ponieważ dopiero uczę się języka Haskell i na razie nie mam pojęcia, jak przekształcić go za pomocą tekstu .
Stephane Rolland
źródło
2

Myślę, że lepiej byłoby spojrzeć na prawdziwy język skryptowy, taki jak PHP, Perl lub Python, aby zrobić coś takiego dla ciebie, szczególnie jeśli naprawdę nie chcesz wdawać się w złożone skrypty powłoki na dużą skalę.

AVP
źródło
Po drugie, kiedy muszę wykonywać takie operacje mungowania tekstu, chwytam Perla (ale Python lub Ruby powinny robić to równie dobrze). Lepiej użyć regularną, dużo stosowanym narzędziem, które znasz dobrze (nawet jeśli nie jest w 100% nadają się do pracy) niż wyspecjalizowanego programu rzadko można wykorzystać (i które prędzej czy później będzie spadać sort jakoś).
vonbrand,
2

Nie wiem, dlaczego to robisz, ale masz tutaj dwa szablony. Jeden to twoja „baza danych”, a drugi to twój prawdziwy szablon. Oba są łatwe w obsłudze dzięki shtpl . (mój prywatny projekt, więc nie jest powszechnie używany, ale został opracowany w celu rozwiązania tego rodzaju problemów)

Z shtpl zrobiłbyś coś takiego:

Treść „konfiguracji” pliku:

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

Zawartość pliku „baza danych” (założyłem, że separatorem jest 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

Treść pliku 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

Zawartość main.txt (other.txt jest taka sama):

main.txt template
$data1
$data2
$data3

Więc wykonanie pliku generatetemplates.sh

$ bash generatetemplates.sh "./configuration"

generuje nas first.txt, second.txt i 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

Małe wyjaśnienie: W generatetemplates.sh jest najpierw potrzebna „baza danych” wygenerowana z pliku konfiguracyjnego. Po drugie, dla każdego tupela w bazie danych na końcu odpowiedni plik wyjściowy z twojego szablonu wejściowego.

Uwaga: Odczyt problemów z pustymi danymi [123]. Dzięki takiemu podejściu nie jest to możliwe.

Mam nadzieję, że jest to wystarczająco proste dla twoich potrzeb.

Baw się dobrze!

zstegi
źródło
1

Niedawno opublikowałem projekt open source, który osiąga ten właśnie efekt przy użyciu składni szablonu podobnej do jinja. To się nazywa ciasteczko . Oto demo:

demo ciasteczka

Bryan Bugyi
źródło
1

Sprawdź tcat.sh . Załóżmy, że masz plik szablonu:

hello ${name}

następnie

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

Wynik:

hello world
Dagang
źródło