템플릿에서 텍스트 파일을 만드는 도구


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 또는 펄 스크립트를 사용해보십시오. 문자열을 처리하는 더 강력하고 쉬운 방법이 있습니다.
John Siu


답변:


5

아마도 수천 개의 템플릿 언어와 관련 소프트웨어가있을 것입니다. 일반적인 예는 바닐라 루비의 일부인 ERB 입니다. Ruby를 설치 한 후에 irb는 에디터 나 에디터를 시작 하고 표준 예제를 붙여 넣기 만하면됩니다.

require 'erb'

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

5

다음을 고려할 수도 있습니다.

  • GNU 도구 m4는 텍스트 프로세서로, 입력 할 텍스트를 입력으로 변경하여 변경할 부분이있는 템플릿을 출력합니다. 쉘 스크립트보다 간단합니다. (#define macro IIRC를 사용하는 C 전처리 기와 비슷하거나 유사하게 작동합니다).

  • xsltproc변형을 적용하고 결과를 제공 하는 GNU 도구 . 템플릿은에 xml있으며 텍스트를 출력 xslt하기 위해 수행 할 변환 형식입니다 xml.

개인적으로을 선호 xslt하지만 귀하의 경우 양식의 필드와 맞지 않을 수도 %DATA1% %DATA2%있습니다. xml이 필요하므로 템플릿을 변경하는 것을 싫어합니다.

따라서 실제로 살펴보아야 m4합니다.

  • 또 다른 선택으로, Haskell프로그래밍 언어가 실제로 스트림 변환에 능숙하다고 들었습니다 . Haskell 애호가 Parsec가 문자열 스트림을 자연스럽게 파싱 할 수 있는 멋진 패키지 에 대해 이야기하기 때문에이 아이디어 만 고려 하고 있습니다. 이미 좋은 xslt보다 훨씬 낫습니다. 나는 단지 Haskell을 배우기 때문에 반복하기 만하며, 지금은 텍스트를 변환하는 방법에 대한 단일 아이디어가 없습니다 .

2

PHP, Perl 또는 Python과 같은 실제 스크립팅 언어를 사용하여 이와 같은 작업을 수행하는 것이 좋습니다. 특히 대규모의 복잡한 쉘 스크립트에 들어가고 싶지 않은 경우 특히 그렇습니다.


그런 다음 텍스트 뭉치 작업을해야 할 때 Perl을 잡습니다 (그러나 Python 또는 Ruby는 똑같이 잘 수행해야 함). 거의 사용하지 않는 특수 프로그램 (그리고 그 이후에 어떤 방식 으로든 분류 될 것임 )보다 잘 알고있는 규칙적이고 많이 사용되는 도구를 사용하는 것이 좋습니다 (작업에 100 % 적합하지 않더라도 ).
vonbrand

2

왜 그렇게하는지 모르겠지만 여기에 두 개의 템플릿이 있습니다. 하나는 '데이터베이스'이고 다른 하나는 실제 템플릿입니다. 둘 다 shtpl 로 처리하기 쉽습니다 . (나의 개인 프로젝트이므로 널리 사용되지는 않지만 실제로 이러한 종류의 문제를 해결하기 위해 개발되었습니다)

shtpl을 사용하면 다음과 같이 할 수 있습니다.

'configuration'파일의 내용 :

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"

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

작은 설명 : generatetemplates.sh에서 먼저 구성 파일에서 생성 된 필요한 '데이터베이스'입니다. 그리고 두 번째로 데이터베이스의 모든 tupel에 대해 마침내 템플릿에서 해당 Out-file을 가져옵니다.

참고 : 빈 데이터 [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.