如何使用 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\=\=

相关内容