我有一個名為我的文件.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\==
從佩爾多克對於\Q
和q()
傳回 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\=\=