다음과 같은 쉘 구성 파일이 있다고 가정해 보겠습니다 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
변수를 계산하고 확장하려면 이 명령을 사용하세요 .