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

関連情報