템플릿을 기반으로 파일을 생성하는 간단하고 표준적인 방법은 무엇입니까?

템플릿을 기반으로 파일을 생성하는 간단하고 표준적인 방법은 무엇입니까?

내 프로젝트의 경우 템플릿 파일을 기반으로 일부 파일을 생성하는 방법이 필요합니다. 제가 상상하는 것은 이렇습니다.

  • 템플릿 파일에는 {{var1}}대체할 변수와 유사한 데이터가 포함되어 있습니다.

  • key = value다른 파일에는 값 목록이 포함되어 있습니다.

  • 도구를 적용한 후 특정 값을 포함하는 새 파일이 생성되어야 합니다.

두 번째 파일 대신 명령줄을 통해 쌍 목록이 제공될 수도 있고 key = value, 마찬가지로 일부 키에는 두 번째 파일의 키 값이 아닌 환경 변수가 필요할 수도 있습니다.

어디표준 및 잘 알려진 유틸리티Linux/Unix 세계에서 이것이 가능합니까?

답변1

이런 스크립트를 작성하는 것은 정말 쉽습니다. 예를 들어 다음을 수행할 수 있습니다.원천한 쌍의 파일을 만든 key=value다음 이를 사용하여 템플릿의 내용을 바꿉니다. 예를 들어:

$ cat template
Hello $name,
someone told me you really like $thing!

$ cat values
name=Bob
thing=chocolate

그러면 스크립트는 다음과 같습니다.

#!/bin/sh

## source the key/value pairs
. "$1"

## Replace them in the template
sed -e "s/\\\$name/$name/g" -e "s/\\\$thing/$thing/g" "$2"

다음과 같이 실행합니다.

$ foo.sh /full/path/to/values template
Hello Bob,
someone told me you really like chocolate!

물론 이를 위해서는 키 이름을 미리 알아야 합니다. 또 다른 옵션은 다음과 같습니다.

#!/bin/sh

tmpFile=$(mktemp)
cp -- "$2" "$tmpFile"

while IFS='=' read -r key value; do
  sed -i -e "s/\$$key/$value/g" "$tmpFile"
done < "$1"

cat "$tmpFile"

eval또 다른 옵션은 확장 변수를 사용하는 것입니다 . 하지만 이는 파일의 값이 잠재적으로 위험한 경우 코드 삽입의 위험이 있으므로 위험합니다. 이것이 문제가 되지 않는다면 다음을 시도해 보세요.

#!/bin/sh

## source the key/value pairs
. "$1"

## load the contents of the template
template="$(cat "$2")"
## Now print, but expanding the variables. We need to 
## unset IFS to protect the newlines.
IFS=
eval echo \"$template\"

관련 정보