텍스트에 환경 변수가 있는 경우 바꾸기

텍스트에 환경 변수가 있는 경우 바꾸기

envsubst입력에 선언된 환경 변수를 대체한다는 것을 알고 있습니다 .

$ echo 'Hello $USER' | envsubst
Hello myusername

envsusbst내가 원하는 것은 환경 변수가 존재하는 경우 이를 대체 하고 변수 문자열은 그대로 유지하는 방법(또는 다른 명령)입니다 . 내가 얻는 것은 다음과 같습니다.

$ echo 'Hello $USER $UNDEFINED_VARIABLE' | envsubst
Hello myusername

내가 원하는 것은:

$ echo 'Hello $USER $UNDEFINED_VARIABLE' | somecommand
Hello myusername $UNDEFINED_VARIABLE

답변1

$USER$PATH다음과 같은 매개변수 를 전달하면 envsubst해당 매개변수에서 참조되는 변수만 확장됩니다.

따라서 한 가지 접근 방식은 현재 정의된 모든 환경 변수를 해당 형식으로 전달하는 것일 수 있습니다. 그리고 zsh:

echo 'Hello $USER ${USER} $UNDEFINED_VARIABLE' |
  envsubst \$${(kj:$:)parameters[(R)*export*]}
  • $parameters변수 이름을 해당 유형에 매핑하는 특수 연관 배열입니다.
  • $parameters[(R)*export*]연관 배열의 값에 포함된 모든 요소로 확장됩니다 export.
  • k매개변수 확장 플래그를 사용하세요 .열쇠반환 값 대신
  • j:$:이러한 요소를 연결 $하고 처음에 하나를 추가하십시오.

다른 쉘의 경우 언제든지 돌아가서 perl목록을 가져올 수 있습니다.

echo 'Hello $USER ${USER} $UNDEFINED_VARIABLE' |
  envsubst "$(perl -e 'print "\$$_" for grep /^[_a-zA-Z]\w*$/, keys %ENV')"

환경 변수 유출에 주의하세요이름출력에서 ps.

대신 다음에서 모든 작업을 수행할 수 있습니다 perl.

perl -pe 's{(?|\$\{([_a-zA-Z]\w*)\}|\$([_a-zA-Z]\w*))}{$ENV{$1}//$&}ge'

같은게 있으니 주의하세요한정그냥 envsubst그런거야그것은 다음과 같은 것을 확장하지 않습니다${VAR:-x}쉘이 확장되지 않는 등 의 $HOME항목 을 확장합니다 .\$HOME$$HOME

답변2

를 사용하면 env현재 정의된 모든 환경 변수를 본 다음 해당 목록을 사용하여 해당 변수만 바꿀 수 있습니다. (맨 페이지는 이에 대해 너무 명확하지 않지만 다음을 참조하십시오.이 답변설명을 위해. )

echo 'Hello $USER $UNKNOWN' | envsubst "$(env | cut -d= -f1 | sed -e 's/^/$/')"

(의 출력에는 env변수 값도 나열되어 있지만 envsubst선행 값도 보고 싶기 $때문에 불행히도 그것만으로는 사용할 수 없습니다 cut -d= -f1. 또한 단일을 사용하여 작업을 완료할 수 있습니다. 이전 개정판을 참조하세요 sed. 그러나 나는 약간의 성능 향상보다는 cut명확성을 선호합니다 .)cut

관련 정보