我有一个名为我的文件.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\=\=