如何使用 sed 替換其中包含“\”的字串?

如何使用 sed 替換其中包含“\”的字串?

我有一個名為我的文件.txt包含以下內容:

使用者名稱=我的使用者名稱
加密密碼=9k3S+sS3g\=\=

每次我需要更改使用者名稱和密碼時,我都會執行 shell 腳本。在 shell 腳本中,我將保存的使用者名稱和密碼儲存到兩個變數中,即:

舊用戶名=“我的用戶名”
舊密碼=“9k3S+sS3g\=\=”

新用戶名=“我的新用戶名”

新密碼=“U8djlk+h==”

sed -i "s/$oldusername/$newusername/g" MyFile.txt

sed -i "s/$oldpassword/$newpassword/g" MyFile.txt

第一個 sed 工作正常並替換了用戶名,但是第二個 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\==

佩爾多克對於\Qq()

傳回 EXPR 的值,其中所有 ASCII 非「單字」字元都帶有反斜線。 (也就是說,無論任何區域設定如何,所有不匹配/[A-Za-z_0-9]/ 的ASCII 字元都會在返回的字串中前面加上反斜線。)這是在double 中實現\Q 轉義的內部函數- 帶引號的字串

一旦結果沒問題,就perl -i -pe用於就地編輯,與sed

答案3

您是否已回顯 $oldpassword 的內容? $oldpassword 將缺少反斜杠,

$ oldpassword=9k3S+sS3g\=\=
$ echo $oldpassword
9k3S+sS3g==

這樣比賽就會失敗。

如果您希望其中有反斜線字符,請在分配給 oldpassword 的值兩邊加上單引號,以阻止 shell 將它們解釋為轉義序列,即,使該值成為文字字串,

$ oldpassword='9k3S+sS3g\=\=

相關內容