我针对每个环境都加密了密码。它有一些特殊的字符。以下是开发环境中的一个示例(带有正斜杠)
$$Param_INFA_USER=USR_DF
$$Param_INFA_PASS=1OFR6pSbNq/yvLtpxHbC9E9KvloTj5tRGpzr9dCMD7E=
v_prst_pwd=`grep -i "\\$\\$Param_INFA_PASS" param_file.parm` | tr -d ' '
v_lbl_pwd=`grep -i "\\$\\$Param_INFA_PASS" param_file.parm | cut -d '=' -f1`
sed -i 's/'$v_prst_pwd'/'$v_lbl_pwd'='$envspfc_pwd'/g' param_file.parm
sed -i s/$$Param_INFA_PASS=**1OFR6pSbNq/yvLtpxHbC9E9KvloTj5tRGpzr9dCMD7E=**/$$Param_INFA_PASS=ABC/g param_file.parm
我正在尝试更换密码并遇到以下问题。
sed: -e expression #1, char 74: unknown option to `s'
替换作为变量的字符串时如何转义特殊字符(不知道特殊字符的位置)。
答案1
的价值Param_INFA_PASS
显而易见Base64。它可以包含字母、数字和字符+
、/
和=
。
对于普通 grep,这些字符都不是特殊的。请注意,对于 egrep 或grep -E
,该字符+
很特殊,需要转义。不要使用grep -i
:Base64 区分大小写。
对于 sed 来说,如果你做得正确的话,这些字符都不是特殊的。在s
命令中,您可以使用任何字符 来代替/
。例如,选择 Base64 中未使用的一个
sed -e "s~^PASSWORD=$old_password\$~$new_password~g"
¹换行符和反斜杠除外。
答案2
sed才不是用作/
其分隔符。
由于这些示例,我们认为 sed 用作/
分隔符。但是它可以使用任何字符。
例如sed 's/abc/def/'
可以写成sed 's^abc^def^
.后面跟着的s
是分隔符。
如果输入文本中未使用某个字符,那么您可以利用它来发挥作用(也许选择非打印字符)。