各環境のパスワードを暗号化しました。いくつかの特殊文字があります。以下は開発環境の例です(スラッシュを含む)。
$$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
入力テキストに文字が使用されていない場合は、これを利用できます(印刷されていない文字の選択など)。