정기적으로 템플릿을 사용하여 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%%와 같은 자리 표시자가 있는 텍스트 파일입니다(자리 표시자의 형식은 변경될 수 있음).
복잡한 쉘 스크립트를 사용하는 것보다 이를 더 잘 자동화할 수 있는 도구를 아는 사람이 있습니까?
답변1
다음을 고려할 수도 있습니다.
m4
원하는 텍스트를 출력하고 이를 변경하려는 부분이 포함된 입력 템플릿으로 사용하는 텍스트 프로세서인 GNU 도구 입니다. 확실히 쉘 스크립트보다 간단합니다. (#define 매크로 IIRC를 사용하는 C 전처리기처럼 작동합니다.)xsltproc
변환을 적용하고 출력을 제공하는 GNU 도구입니다. 템플릿은xml
텍스트 를 출력하기 위해xslt
수행하려는 변환 형식입니다 .xml
개인적으로 나는 그것을 선호 xslt
하지만 귀하의 경우에는 양식의 필드에 맞지 않습니다 %DATA1%
%DATA2%
. 템플릿을 변경하고 싶지 않으므로 xml이 필요합니다.
그래서 당신은 정말로 그것을 확인해야합니다 m4
.
- 대안으로 프로그래밍 언어는 스트림 변환에 매우 능숙하다는 말을 들었습니다
Haskell
. 내가 이 아이디어를 고려한 이유는 Haskell 애호가들이Parsec
문자열 스트림을 자연스럽게 구문 분석할 수 있는 이 환상적인 패키지에 대해 이야기했기 때문입니다. xslt보다 훨씬 낫습니다. 이미 매우 좋습니다.방금 Haskell을 배웠고 현재는 Haskell로 텍스트를 변환하는 방법을 모르기 때문에 반복하고 있습니다..
답변2
아마도 수천 가지의 템플릿 언어와 관련 소프트웨어가 있을 것입니다. 인기 있는 예는 다음과 같습니다.유럽 연구 기관, 이는 바닐라 Ruby의 일부입니다. Ruby를 설치한 후 편집기를 실행 irb
하고 표준 예제를 붙여넣기만 하면 느낌을 얻을 수 있습니다.
require 'erb'
x = 42
template = ERB.new <<-EOF
The value of x is: <%= x %>
EOF
puts template.result(binding)
답변3
왜 이렇게 하시는지는 모르겠지만 여기에는 두 개의 템플릿이 있습니다. 하나는 "데이터베이스"이고 다른 하나는 실제 템플릿입니다. 둘다 다루기 편해요stpl. (저의 개인 프로젝트라 널리 사용되지는 않지만 실제로 이런 문제를 해결하기 위해 개발되었습니다)
shtpl을 사용하면 다음과 같은 작업을 수행할 수 있습니다.
"구성" 파일 내용:
template_main=main.txt
template_other=other.txt
text1=whatever
text2=blah
"database" 파일의 내용(구분자는 탭(\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, 두 번째 .txt 및 세 번째 .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에서 첫 번째 단계는 구성 파일에서 필요한 "데이터베이스"를 생성하는 것입니다. 둘째, 데이터베이스의 각 튜플에 대해 끝에는 내부 템플릿의 해당 출력 파일이 있습니다.
참고: 데이터 [123]가 비어 있으면 읽기가 어려워집니다. 따라서 이 접근 방식은 불가능합니다.
따라서 이것은 귀하의 요구에 충분히 간단하기를 바랍니다.
재미있게 보내세요!
답변4
나는 최근 이를 달성하기 위해 jinja와 유사한 템플릿 구문을 사용하는 오픈 소스 프로젝트를 출시했습니다. 그것은 알려져있다쿠키. 다음은 데모입니다: