단일 패스로 파일에 자리 표시자를 채우십시오
문제
자리 표시 자 줄이있는 골격 텍스트 파일이 있습니다.
blah blah blah
blah $PLACEHOLDER_1$
blah
$PLACEHOLDER_2$
등등. 자리 표시 자의 특정 "형태"는 중요하지 않습니다. 특정 구현에 가장 편안한 것으로 변경할 수 있습니다.
자리 표시 자에 대한 값을 알고있는 Bash 스크립트가 있으며 자리 표시자가 값으로 교체 한 새 파일을 생성해야합니다.
#! /bin/sh
PLACEHOLDER_1 = 'string 1'
PLACEHOLDER_2 = 'multiline
string
2'
# TODO: Generate file output.txt from file output.template
# using placeholders above.
나는 SED와 함께 여러 패스로 이것을 할 수 있지만 재미 있지 않습니다. 그래요 ~ 아니다 Perl을 사용하고 싶습니다. TextUtils를 사용하고 자체적으로 만 강타하고 싶습니다.
단일 패스에서 내가 원하는 것을하는 가장 좋은 방법은 무엇입니까?
해결책
SED를 사용하여 단일 패스로 교체 할 수 있습니다. 하나의 명령으로 모든 교체품을 지정하면됩니다.
예를 들어.
sed -i 's/PLACEHOLDER_1/string 1/g;s/PLACEHOLDER_2/string 2/g' <file>
다른 팁
SED없이 수행하는 방법은 다음과 같습니다.
먼저, 자리 표시자가 BASH 변수 인 약간 수정 된 템플릿 파일입니다.
blah blah blah
blah $PLACEHOLDER_1
blah
$PLACEHOLDER_2
그리고 대본 :
#! /bin/sh
templatefile=output.template
outputfile=output.txt
PLACEHOLDER_1='string 1'
PLACEHOLDER_2='multiline
string
2'
# DONE: Generate file output.txt from file output.template
# using placeholders above.
echo "$(eval "echo \"$(cat $templatefile)\"")" > $outputfile
다음은 스크립트에 포함 된 템플릿을 보여 주지만 비틀기가있는 버전입니다. 또한 템플릿 파일 버전에서도 사용할 수있는 기본값을 보여 주며 템플릿에서 수학을 수행 할 수 있습니다.
#! /bin/sh
template='blah blah blah
blah $PLACEHOLDER_1
blah
${PLACEHOLDER_2:-"some text"} blah ${PLACEHOLDER_3:-"some
lines
of
text"} and the total is: $((${VAL_1:-0} + ${VAL_2:-0}))'
# default operands to zero (or 1) to prevent errors due to unset variables
outputfile=output.txt
# gears spin, bells ding, values for placeholders are computed
PLACEHOLDER_1='string 1'
PLACEHOLDER_2='multiline
string
2'
VAL_1=2
VAL_2=4
unset PLACEHOLDER_3 # so we can trigger one of the defaults
# Generate file output.txt from variable $template
# using placeholders above.
echo "$(eval "echo \"$template\"")" > $outputfile
SED, 루프도없고, 털이 둥지와 인용문. 나는 모든 인용문이 템플릿 파일의 악의적 인 것들로부터 당신을 보호 할 것이라고 확신하지만, 그것을 보장하지는 않을 것입니다.
이전 답변을 바탕으로 배열을 사용하고 SED 문자열을 계산합니까?
#!/bin/sh
PLACEHOLDER[0]='string 1'
PLACEHOLDER[1]='multiline
string
2'
s="sed -i "
for(( i=0 ; i<${#PLACEHOLDER[*]} ; i++ )) ; do
echo ${PLACEHOLDER[$i]}
s=$s"s/PLACEHOLDER_$i/${PLACEHOLDER[$i]}/g;"
done
echo $s
그래도 멀티 라인 문자열에서 실패하는 것 같습니다.
휴대용 배쉬 배열이 얼마나 될지 모르겠습니다. 위의 스 니펫은 "GNU Bash, 버전 3.2.17 (1)-release (i386-Apple-Darwin9.0)로 테스트되었습니다.
내 배쉬 전용 솔루션 :
TEMPLATE='
foo
$var1
bar
$var2'
eval "echo \"$TEMPLATE\""
나는 단지 똑같은 것을 찾고 있었기 때문에이 질문을 우연히 발견했습니다. envsubst(1)
.
당신이 사용할 수있는 Envsubst 환경 변수를 사용하지 않는다면 :
PLACEHOLDER_1='string 1' PLACEHOLDER_2='multiline
string
2' envsubst < output.template
변수가 많으면 파일에 저장할 수 있습니다. source
(사용해야합니다 export
소스 파일의 끝에!)