반면:
~$ cat .test-profile
export [email protected]
export MONGODB_URI='mongodb+srv://administrator:[email protected]/test?retryWrites=true&w=majority'
변수 값을 대체하기 위해 다음 쉘 스크립트를 작성했습니다.
BASH_PROFILE="$HOME/.test-profile"
MONGODB_URI="mongodb+srv://administrator:[email protected]/mysite_development?retryWrites=true&w=majority"
INSERT_ENV_VAR () {
if [[ -z "$2" ]]
then
echo "Failed to retrieve $1"
else
if grep -q "$1" "$BASH_PROFILE"; then
# Cannot use / delimiter, for value can contain /
sed -in -E "s|(export $1=)[a-zA-Z0-9@.:\/=&\-\?\+]+|\1$2|g" "$BASH_PROFILE"
else
echo "export $1=$2" >> "$BASH_PROFILE"
fi
fi
}
INSERT_ENV_VAR 'ADMIN_EMAIL' '[email protected]'
INSERT_ENV_VAR 'MONGODB_URI' $MONGODB_URI
ADMIN_EMAIL 변수는 정상적으로 대체되지만 MONGODB_URI 변수는 그렇지 않습니다. 정규식 내부의 문자 클래스[]와 관련하여 뭔가를 해야 한다고 생각합니다. 그러나 나는 무엇을 확신하지 못합니다. Ruby와 같은 프로그래밍 언어로 시도했는데 일치하는 결과를 찾았습니다. 그러나 sed를 사용하면 일치하는 항목을 찾을 수 없습니다. 왜?
.test-profile
이후에는 다음과 같을 것으로 예상됩니다 .
export [email protected]
export MONGODB_URI='mongodb+srv://administrator:[email protected]/mysite_development?retryWrites=true&w=majority'
"mysite_development"가 "test"를 대체합니다.
답변1
스크립트의 MONGODB_URI 정의에서 & 로그인을 이스케이프하고 정규식을 단순화하여 sed에서 -n
불필요한 항목을 제거 g
하면 이렇게 됩니다(이 버전에서는 테스트 구성 파일의 이름이 다르게 지정되었지만 무엇을 해야 할지 명확해야 합니다). :
BASH_PROFILE="/tmp/test_profile"
MONGODB_URI="mongodb+srv://administrator:[email protected]/mysite_development?retryWrites=true\&w=majority"
INSERT_ENV_VAR () {
if [[ -z "$2" ]]
then
echo "Failed to retrieve $1"
else
if grep -q "$1" "$BASH_PROFILE"; then
# Cannot use / delimiter, for value can contain /
sed -i -E "s;(export $1=).*;\1$2;" "$BASH_PROFILE"
else
echo "export $1=$2" >> "$BASH_PROFILE"
fi
fi
}
INSERT_ENV_VAR 'ADMIN_EMAIL' '[email protected]'
INSERT_ENV_VAR 'MONGODB_URI' $MONGODB_URI
내가 얻은 테스트 프로필을 사용하여 실행하면 다음과 같습니다.
export [email protected]
export MONGODB_URI=mongodb+srv://administrator:[email protected]/mysite_development?retryWrites=true&w=majority
답변2
sed -i "/export $1=/{i export $1='$2'
;d}" "$BASH_PROFILE"
이렇게 하면 교체 sed
하지 않고 사용할 수 있습니다.&
\&
grep -q
당신은 선택을 할 수 있습니다-F
, 또는 당신은 할 수 있습니다-m 1