一方:
~$ 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