尝试用文件中包含反斜杠 \ 的字符串替换值

Trying to replace a value with a string containing backslash \ in a file

我真的需要你的帮助。

我想做什么 :
我有一个 encrypted 密码,我想写在 属性 文件中。假设我将此密码存储在 $password 中,我想将其作为值写入 my.varfile 文件中名为“passKey”的密钥。

这是我到目前为止使用的命令 :
sed -i "s|passKey=[^ ]*|passKey=$password|" /path/to/my.varfile

问题:
它工作得很好,直到我得到一个包含反斜杠的加密密码 \
=> 发生的事情是 sed 将反斜杠解释为转义字符,从而弄乱了密码。

例如,当我有这样的传球时:205RjIiajQ\=\=
它在我的文件中写为:205RjIiajQ==

我尝试了很多方法,比如在我的密码中用 \\ 替换 \ 以实际转义反斜杠,但没有成功。

关于如何做到这一点有什么想法吗?
我也乐于接受建议,例如尝试使用 sed 以外的任何其他方法来做到这一点。

(请注意 - 不幸的是:p - 我在这里使用 ksh,而不是 bash)

谢谢
T.

一个想法是使用 pattern substitution (see section 4.5.4)$password.

中每次出现的 \ 添加转义字符 (\)

假设我们有以下密码:

$ password='205R\\jIiajQ\=\='

OP 当前的 sed 解决方案(和不正确的结果):

$ sed "s|passKey=[^ ]*|passKey=${password}|" file
passKey=205R\jIiajQ\==

让我们使用参数替换将每个 \ 替换为 \:

$ password="${password//\/\\}"       # we have to escape each `\` to keep it from being treated as an escape character
$ echo "${password}"
205R\\\jIiajQ\\=\=

OP 的 sed 新解决方案 $password(以及正确的结果):

$ sed "s|passKey=[^ ]*|passKey=${password}|" file
passKey=205R\\jIiajQ\=\=

这是一个ksh93 fiddle

注释:

  • 一旦 OP 验证此解决方案有效,可以根据需要将 -i 选项添加回 sed 命令
  • 如果需要保持原来的 $password 值,可以使用一个新变量来保存 'escaped' 字符串(例如,newpwd="${password//\/\\}" ; sed "s|....|passkey=${newpwd}|" file