というファイルがありますマイファイル.txt次のコンテンツが含まれています。
ユーザー名=私のユーザー名
暗号化されたパスワード=9k3S+sS3g\=\=
ユーザー名とパスワードを変更する必要があるたびにシェルスクリプトを実行します。シェルスクリプトは、保存されたユーザー名とパスワードを次の2つの変数に保存します。
前のユーザー名 = "私のユーザー名" 前の
パスワード = "9k3S+sS3g\=\="newusername="私の新しいユーザー名"
新しいパスワード="U8djlk+h=="
sed -i "s/$oldusername/$newusername/g" MyFile.txt
sed -i "s/$oldpassword/$newpassword/g" MyFile.txt
最初の sed は正しく機能し、ユーザー名を置き換えますが、2 番目の sed コマンドは機能せず、ファイルのパスワードは変更されません。変数に「\」文字があるためです。
誰でもこの問題を解決し、解決策を教えてもらえますか?
ありがとうございます..
答え1
愚かな回避策、すべてのバックスラッシュを避けてください。
oldpassword="$(printf "$oldpassword" | sed 's/\\/\\\\/g')"
sed -i "s/$oldpassword/$newpassword/g" MyFile.txt
答え2
$ cat MyFile.txt
Username=myusername
EncryptedPassword=9k3S+sS3g\=\=
$ oldusername="myusername"
$ oldpassword="9k3S+sS3g\=\="
$ newusername="mynewusername"
$ newpassword="U8djlk+h\=="
$ perl -pe "s/\Q$oldusername/q($newusername)/e ; s/\Q$oldpassword/q($newpassword)/e" MyFile.txt
Username=mynewusername
EncryptedPassword=U8djlk+h\==
~からパドック\Q
そしてq()
バックスラッシュが追加されたすべてのASCII文字以外の文字を含むEXPR値を返します。 (つまり、ロケールに関係なく/ [A-Za-z_0-9] /と一致しないすべてのASCII文字の前には、返された文字列からバックスラッシュが続きます。)これは、二重\ Qエスケープ組み込み - 引用符で実装されています。ひも
結果が良い場合は、perl -i -pe
内部編集に使用します。sed
答え3
$oldpasswordの内容をエコーしましたか? $oldpasswordにバックスラッシュがありません。
$ oldpassword=9k3S+sS3g\=\=
$ echo $oldpassword
9k3S+sS3g==
これによりゲームは失敗します。
バックスラッシュ文字を入れるには、oldpasswordに割り当てられた値の周りに一重引用符を入れて、シェルがそれをエスケープシーケンスとして解釈しないようにします。つまり、値をリテラル文字列にします。
$ oldpassword='9k3S+sS3g\=\=