带有$符号的sed变量

时间:2013-03-07 20:57:12

标签: sed

我确定之前已经问到这个问题,如果有,我很抱歉,但我找不到它。

我正在尝试用dovecot SHA512-CRYPT密码替换下面的'mypassword'但是美元符号搞砸了,我无法弄清楚如何逃脱它。

doveadm pw -s SHA512-CRYPT -p ${rootemailpw}生成的密码类似于以下内容,您可以看到其中包含几个美元符号:

{SHA512-CRYPT}$6$sujue1sr0abLZisA$Dq1qtz422woyR/A4wDaJ9JYByKHis27FO.mO5EfUCDuI/PRSawxgCRGA3Oq/LE4Nbr32nCr4731BCPIotmRNR0

这是我正在使用的脚本:

rootemailpw=$(</dev/urandom tr -dc A-Za-z0-9 | head -c12)
rootpw=$(doveadm pw -s SHA512-CRYPT -p ${rootemailpw})

cat <<'EOF' > tmp
USE `postfix`;
INSERT INTO `users` (`username`,`password`) VALUES ('root@localhost','mypassword');
EOF

sed -i "s/mypassword/${rootpw}/" tmp

那么如何在s/mypassword/${rootpw}/

中正确地逃避$符号

2 个答案:

答案 0 :(得分:3)

SHA哈希值可能包含斜杠字符(/),这是通常的sed分隔符。 sed支持大多数分隔符,因此一种方法是使用不同的分隔符,例如管道符(|):

pw=$(doveadm pw -s SHA512-CRYPT -p somepassword)
echo password | sed "s|password|$pw|"

输出:

{SHA512-CRYPT}$6$qtXJPWaMbX3l8zMW$mXWuax8NG9Wa1AkFdcClA5vw2T3407uBdImKNNbcBd/CUkS5NafjZnQ5ow.IubyLujU5ohS8PWogdNoPiF4d//

答案 1 :(得分:0)

使用./tmp中的以下内容:

USE `postfix`;
INSERT INTO `users` (`username`,`password`) VALUES ('root@localhost','mypassword');

执行rootpw='1234$asdf' ; cat tmp | sed "s/mypassword/${rootpw}/"会将 mypassword 替换为 $ {rootpw} 的内容,如下所示:

USE `postfix`;
INSERT INTO `users` (`username`,`password`) VALUES ('root@localhost','1234$asdf');

有:

  1. rootpw='1234$asdf'设置环境变量
  2. cat tmp | sed "s/mypassword/${rootpw}/" mypassword 替换为“1234 $ asdf”
  3. 在变量上使用单引号。

    这会回答你的问题吗?