sedを使用して "\"を含む文字列を置き換える方法は? [コピー]

sedを使用して "\"を含む文字列を置き換える方法は? [コピー]

というファイルがありますマイファイル.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\=\=

関連情報