Công cụ tạo tệp văn bản từ mẫu


9

Tôi phải thường xuyên tạo hơn 100 tệp văn bản từ các mẫu.
Tôi hiện đang sử dụng một kịch bản shell quá phức tạp. Tôi nghĩ có một cách thông minh hơn để xử lý việc này, nhưng tôi không biết làm thế nào.

Tôi có một "cơ sở dữ liệu":

# 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

Và một tập tin cấu hình:

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

Các mẫu là các tệp văn bản có trình giữ chỗ như %% data2 %% (có thể thay đổi mẫu giữ chỗ).

Có ai biết một công cụ để tự động hóa điều này tốt hơn với một kịch bản shell phức tạp?


Rất khó để đánh giá những gì phức tạp. Đăng một trong số họ sẽ giúp chúng tôi hiểu tình hình. Có thể thử tập lệnh php hoặc perl? Mà có cách mạnh mẽ hơn / dễ dàng hơn để xử lý chuỗi.
John Siu


Câu trả lời:


5

Có lẽ có hàng ngàn ngôn ngữ mẫu và phần mềm liên quan như vậy. Một ví dụ phổ biến là ERB , một phần của vani Ruby. Sau khi cài đặt Ruby, bạn có thể khởi động irbhoặc chỉnh sửa và chỉ cần dán ví dụ chính tắc để có cảm giác về nó:

require 'erb'

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

5

Bạn cũng có thể xem xét:

  • công cụ GNU được gọi m4là bộ xử lý văn bản xuất văn bản bạn muốn lấy làm đầu vào một mẫu có các phần cần thay đổi. Nó chắc chắn sẽ đơn giản hơn shell script. (nó hoạt động nhiều hơn hoặc giống như một bộ tiền xử lý C với #define macro IIRC).

  • công cụ GNU xsltprocáp dụng một phép biến đổi và cung cấp cho bạn đầu ra. Mẫu nằm trong xmlxsltlà định dạng của những việc chuyển đổi cần làm đối xmlvới văn bản đầu ra của bạn.

Cá nhân tôi có một sở thích xslt, nhưng trong trường hợp của bạn mặc dù nó không phù hợp với các trường trong biểu mẫu %DATA1% %DATA2%. Nó cần xml, vì vậy bạn không muốn thay đổi mẫu của mình.

Vì vậy, bạn nên thực sự có một cái nhìn vào m4.

  • Như một lựa chọn khác, tôi đã được nói rằng Haskellngôn ngữ lập trình thực sự rất tốt trong việc chuyển đổi các luồng. Tôi chỉ xem xét ý tưởng này bởi vì những người yêu thích Haskell nói về Parsecgói tuyệt vời, cho phép phân tích tự nhiên các luồng chuỗi. Tốt hơn nhiều so với xslt, điều này đã tốt rồi. Tôi chỉ lặp lại chúng, bởi vì tôi chỉ đang học Haskell và hiện tại tôi không có ý tưởng duy nhất về cách chuyển đổi văn bản với nó .

2

Tôi nghĩ rằng bạn sẽ tốt hơn nếu nhìn vào một ngôn ngữ kịch bản thực sự, chẳng hạn như PHP, Perl hoặc Python, để làm điều gì đó như thế này cho bạn, đặc biệt nếu bạn thực sự không muốn vào các tập lệnh shell phức tạp quy mô lớn.


Tôi thứ hai, khi tôi phải thực hiện các thao tác trộn văn bản như vậy, tôi lấy Perl (nhưng Python hoặc Ruby cũng sẽ làm tốt như nhau). Sử dụng tốt hơn một công cụ thường xuyên, được sử dụng nhiều mà bạn biết rõ (ngay cả khi không phù hợp với công việc 100%) so với chương trình chuyên dụng mà bạn hiếm khi sử dụng (và sớm muộn gì cũng sẽ bị loại).
vonbrand

2

Tôi không biết tại sao bạn làm điều đó, nhưng bạn có hai mẫu ở đây. Một là 'cơ sở dữ liệu' của bạn và một là mẫu thực sự của bạn. Cả hai đều dễ dàng để xử lý với shtpl . (dự án riêng của tôi, vì vậy không được sử dụng rộng rãi, nhưng được phát triển để giải quyết những vấn đề thực sự đó)

Với shtpl bạn sẽ làm một cái gì đó như thế này:

Nội dung của tệp 'cấu hình':

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

Nội dung của tệp 'cơ sở dữ liệu' (Tôi giả sử rằng dấu phân cách là 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

Nội dung của Generatetemsheet.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

Nội dung của main.txt (other.txt hoàn toàn giống nhau):

main.txt template
$data1
$data2
$data3

Vì vậy, thực hiện Generatetemsheet.sh

$ bash generatetemplates.sh "./configuration"

tạo cho chúng tôi First.txt, second.txt và 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

Giải thích nhỏ: Trong Generatetemsheet.sh trước tiên là 'cơ sở dữ liệu' cần thiết được tạo từ tệp cấu hình của bạn. Và thứ hai cho mỗi tupel trong cơ sở dữ liệu cuối cùng là tệp Out tương ứng từ mẫu trong của bạn.

Lưu ý: Dữ liệu trống [123] rắc rối đã đọc. Vì vậy, nó là không thể với phương pháp này.

Vì vậy, hy vọng điều này là đủ đơn giản cho nhu cầu của bạn.

Chúc vui vẻ!


1

Gần đây tôi đã xuất bản một dự án nguồn mở hoàn thành việc đó bằng cách sử dụng cú pháp khuôn mẫu giống như jinja. Nó được gọi là cookie . Đây là bản demo:

thử nghiệm cookie


1

Kiểm tra tcat.sh . Giả sử bạn có tệp mẫu:

hello ${name}

sau đó

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

Đầu ra:

hello world
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.