暗号化されたパスワードの交換[重複]

暗号化されたパスワードの交換[重複]

各環境のパスワードを暗号化しました。いくつかの特殊文字があります。以下は開発環境の例です(スラッシュを含む)。

    $$Param_INFA_USER=USR_DF
    $$Param_INFA_PASS=1OFR6pSbNq/yvLtpxHbC9E9KvloTj5tRGpzr9dCMD7E=
v_prst_pwd=`grep -i "\\$\\$Param_INFA_PASS" param_file.parm` | tr -d ' '
v_lbl_pwd=`grep -i "\\$\\$Param_INFA_PASS" param_file.parm | cut -d '=' -f1`
sed -i 's/'$v_prst_pwd'/'$v_lbl_pwd'='$envspfc_pwd'/g' param_file.parm
sed -i s/$$Param_INFA_PASS=**1OFR6pSbNq/yvLtpxHbC9E9KvloTj5tRGpzr9dCMD7E=**/$$Param_INFA_PASS=ABC/g param_file.parm

パスワードを変更しようとしましたが、次の問題が発生しました。

sed: -e expression #1, char 74: unknown option to `s'

文字列を変数に置き換えるときに特殊文字をエスケープする方法(特殊文字の位置を知らないまま)

答え1

価値Param_INFA_PASSは明らかですBase64。文字、数字、文字を含めることができ+ます。/=

通常のgrepでは、これらの文字のどれも特別ではありません。 egrep または の場合、grep -Eこの文字は+特別なのでエスケープする必要があります。使用しないでくださいgrep -i:Base64は大文字と小文字を区別します。

sedを実行するには、正しく行うと、これらの文字のいずれも特別ではありません。sコマンドでは、代わりに任意の文字を使用できます/。たとえば、Base64 で未使用のものを選択します。

sed -e "s~^PASSWORD=$old_password\$~$new_password~g"

¹改行文字とバックスラッシュは除外されます

答え2

sed確かに/区切り記号として使用されます。

この例のため、sedが/区切り文字として使用されているとします。しかし、どんな文字でも使用できます。

たとえば、後に区切り文字が続く形式でsed 's/abc/def/'作成できます。sed 's^abc^def^s

入力テキストに文字が使用されていない場合は、これを利用できます(印刷されていない文字の選択など)。

関連情報