템플릿의 자리 표시자 바꾸기

템플릿의 자리 표시자 바꾸기

다음과 같은 쉘 구성 파일이 있다고 가정해 보겠습니다 config.

HOST=localhost
PORT=8080

template이제 다음과 같은 템플릿이 있습니다.

The host is <%= @HOST %>
The port is <%= @PORT %>

template자리 표시자를 파일의 값으로 바꾸는 방법은 무엇입니까 ?config

물론 나는 이것을 할 수 있다:

$ . config
$ sed -e "s/<%= @HOST %>/$HOST/" \
> -e "s/<%= @PORT %>/$PORT/" < template
The host is localhost
The port is 8080

하지만 구성 값이 많으면 너무 번거로워집니다. 좀 더 일반적인 방법으로 이 작업을 수행하려면 어떻게 해야 합니까? 각 자리 표시자를 반복하여 실제 값으로 바꾸고 싶습니다.

답변1

다음을 수행할 수 있습니다.

eval "cat << __end_of_template__
$(sed 's/[\$`]/\\&/g;s/<%= @\([^ ]*\) %>/${\1}/g' < template)
__end_of_template__"

즉, sed가 및 문자를 모두 이스케이프 처리한 후 대체하고 <%= @xxx %>쉘이 확장을 수행하도록 합니다.${xxx}$\`

template또는 행이 포함되지 않는다고 보장할 수 없는 경우 __end_of_template__:

eval "cut -c2- << x
$(sed 's/[\$`]/\\&/g;s/<%= @\([^ ]*\) %>/${\1}/g;s/^/y/' < template)
x"

답변2

일방 awk통행:

awk -F= 'FNR==NR{v[$1]=$2;next};{for(p in v)gsub("<%= @"p" %>",v[p])};1' config template

고쳐 쓰다~에 따르면Stephen Chazeras의 검토"=" 기호가 포함된 허용되는 값:

awk -F= 'FNR==NR{v[$1]=substr($0,length($1)+2);next};{for(p in v)gsub("<%= @"p" %>",v[p])};1' config template

답변3

당신은 그것을 사용할 수 있습니다콧수염(1)여러 템플릿 변수를 교체합니다.

$ { echo ---; sed 's/=/: /' config; echo --- } \
  | mustache - <(sed -e 's/<%= @/{{/g' -e 's/%>/}}/g' template)

파이프라인의 첫 번째 요소는 구성 할당을 내 콧수염이 이해할 수 있는 YAML 구문으로 변환합니다. 두 번째 sed명령은 <%= @VAR %>스타일 변수 참조를 콧수염 {{ VAR }}변수 참조로 바꿉니다.

Fedora에서는 mustache패키지의 일부입니다 rubygem-mustache.

또는 다음을 사용할 수 있습니다.envsubst(패키지에서 제공 gettext) 예를 들면 다음과 같습니다.

$ ( export $(cat config) ; sed -e 's/<%= @\([^%]*\) %>/${\1}/g' template 
  | envsubst )

셸에서도 변수 할당이 유효해야 합니다.

답변4

일방 통행:

#!/bin/sh

. config

while read line
do
        eval echo $(echo $line | sed "s/\([^<]*\)<%= @\([^ ]*\) %>/\1 \$\2/")
done < template

결과:

The host is localhost
The port is 8080

를 이용하여 sed"<"까지의 문자를 추출하여 하나의 그룹( \1)을 형성하고, 플레이스홀더를 추출하여 또 다른 그룹( \2)을 형성합니다. 첫 번째 그룹으로 바꾼 다음 두 번째 그룹을 달러 기호로 바꿉니다. eval변수를 계산하고 확장하려면 이 명령을 사용하세요 .

관련 정보