将包含 && 的字符串替换为 sed

将包含 && 的字符串替换为 sed

我编写了一些用于自动化技术验收测试的脚本。由于我们不允许以明文形式编写密码,因此我使用的脚本与许多变量相关联,其中之一是password.key。在执行之前,我password.key=mycryptedpassword从文件中获取该行并解密密码以在脚本中使用它。然后,我尝试用脚本使用的临时文件中的密码替换密钥。这就是我遇到问题的地方。我使用以下代码:

sed -i -e 's/$key/$decryptedPassword/g' json.tmp

它通常工作正常,但我遇到的密码之一是:cl&&TiT8

我如何告诉 sed 和 linux(默认情况下我在 redhat 上使用 ksh shell)忽略这些&&.尝试用一个、两个或三个反斜杠来反斜杠,但没有一个能正常工作。我担心我可能会遇到其他人这样奇怪的密码,我可以采取什么解决方法?

总览: 我就是这么做的: sed -i -e 's/$key/$decryptedPassword/g' json.tmp。当 时$decryptedPassword = cl&&TiT8,这不起作用。

答案1

当您s/regexp/replacement/在 sed 中执行此操作时,字符&inreplacement具有特殊含义,它的任何出现都会被扩展为匹配的字符串regexp。所以你需要用以下方法来转义它们\

sed -i -e 's/$key/cl\&\&TiT8/g' json.tmp

您还需要逃避/'以及\$key$decryptedPassword

如何替换sed 命令中的$keyand ?$decryptedPassword

答案2

  • '$key'不会评价$key,而"$key"会。

尝试

d2=$(echo "$decryptedPassword" | sed -e 's.&.\\\&.g' )
sed -i -e "s/$key/$d2/g" json.tmp
  • 既不提供$key,也不$decryptedPassword包含/
  • 请注意,您需要\&在替换模式中使用,因此您需要首先用&此替换任何 - 同时考虑到您需要同时转义\&,从而导致\\\&“ sed

  • 两者's.&.\\&.g' 兼而有之's.&.\\\&.g'

  • with 's.&.\\&.g'\转义本身, while&被替换为&(通过 sed 替代)
  • with 's.&.\\\&.g'\转义本身,并替换带来 '\&' (没有 sed 替换)

相关内容