문제

자리 표시 자 줄이있는 골격 텍스트 파일이 있습니다.

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 소스 파일의 끝에!)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top