我编写了一些用于自动化技术验收测试的脚本。由于我们不允许以明文形式编写密码,因此我使用的脚本与许多变量相关联,其中之一是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 命令中的$key
and ?$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 替换)