sed 정규 표현식이 쉘 스크립트에서 작동하지 않습니다

sed 정규 표현식이 쉘 스크립트에서 작동하지 않습니다

반면:

~$ 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

관련 정보