sed 명령 인수를 사용하여 GNU 및 BSD Unix와 호환 가능(제자리에서 편집)

sed 명령 인수를 사용하여 GNU 및 BSD Unix와 호환 가능(제자리에서 편집)

현재 모바일 앱의 일부 빌드 관련 작업에 사용하고 있는 쉘 스크립트가 있습니다.

BSD와 GNU 간의 미묘한 차이로 인해 원래 Mac(BSD)에서 작성된 빌드 스크립트 중 하나입니다.

environment=$1

if [[ -z $environment ]]; then 
  environment="beta"
fi
if ! [[ $environment =~ (live|beta) ]]; then
  echo "Invalid environment: $environment"
  exit 1
fi

mobile_app_api_url="https://api"$environment".mysite.com"

cp app/index.html.mob MobileApp/www/index.html

sed -i'' "s#MOBILE_APP_API_URL#\"$mobile_app_api_url\"#g" MobileApp/www/index.html

sed 명령은 BSD(Mac)로 작성되었지만 빌드가 Mac 또는 Ubuntu(GNU)에 있을 수 있으므로 두 가지 버전 모두에서 작동하도록 수정해야 합니다. 가장 좋은 방법은 무엇입니까?

답변1

-i이는 다음 플래그를 사용하여 이식성 문제를 피하기 위해 수행됩니다 sed.

sed 'sed-editing-commands' thefile >tmpfile && mv tmpfile thefile

sed즉, 임시 파일에 쓴 다음 명령이 실패하지 않으면 입력 파일을 임시 파일로 바꿉니다.

이것은 sed내가 아는 모든 구현에 이식 가능합니다.

임시 파일 이름을 안전하게 생성하려면 를 사용하십시오 mktemp. 이것은 표준 유틸리티는 아니지만 액세스할 수 있는 모든 Unices(OpenBSD, NetBSD, Solaris, macOS, Linux)에서 작동합니다.

tmpfile=$(mktemp)
sed 'sed-editing-commands' thefile >"$tmpfile" && mv "$tmpfile" thefile

답변2

$mobile_app_api_urls///의 RHS에 sed에 의미 있는 문자를 포함하면 안 된다는 점에 유의해야 합니다 . 특히, & # \ newline삽입하기 전에 이 변수가 적절하게 이스케이프되었는지 확인해야 합니다 .

답변3

바꾸다:

cp app/index.html.mob MobileApp/www/index.html
sed -i'' "s#MOBILE_APP_API_URL#\"$mobile_app_api_url\"#g" MobileApp/www/index.html

그냥 해:

sed "s#MOBILE_APP_API_URL#\"$mobile_app_api_url\"#g" \
  < app/index.html.mob >  MobileApp/www/index.html

상단 섹션을 다음과 같이 변경하여 ksh93/에 대한 종속성을 제거할 수도 있습니다.bash

environment=$1

case $environment in
  "") environment=beta;;
  live|beta) ;;
  *)
    printf >&2 'Invalid environment: "%s"\n' "$environment"
    exit 1;;
esac

당신은 또한 볼 수 있습니다 environment=${1:-beta}.

[[ $environment =~ (live|beta) ]]그건 그렇고, ksh93그리고 bash테스트$environment 포함하다 live아니면 beta원하는 대로 들리지 않습니다. [[ $environment =~ ^(live|beta)$ ]]괜찮은지 테스트 해봐야지 live또는 beta.

관련 정보