Bash脚本,字符串未正确替换为转义的$和&字符


3

我创建了一个shell脚本,该脚本以字符串作为输入。如果字符串包含$&,则需要用\$和替换这些字符\&。我可以用sed命令做到这一点。之后,我想用该对应的字符串替换特定文本文件中的单词。

请参阅本节以获取更多说明。

这是我的档案。

test.txt

hello my root password is root.

现在,我想用字符串更改词根。该字符串可以是任何可以包含特殊字符(如$或)的东西&

如果我想root用字符串替换my&rootpa$$,那么它应该看起来像my\&rootpa\$\$文本文件中的字符串。

这是我的外壳

#!/bin/bash
dothis(){
    rootpass=$(echo "$1" | sed -r 's/\$/\\$/g');
    rootpass=$(echo "$rootpass" | sed -r 's/\&/\\&/g');
    echo $rootpass;
    sed -i "s/root/$rootpass/g" test.txt
}
dothis "my&rootpa$$";

该脚本可以正常运行echo $rootpass,也就是说,当我回显字符串时,它将显示my\&rootpa\$\$

但是在文件中看起来my&rootpa$$不是my\&rootpa\$\$。脚本出了什么问题?

请指教。


请不要跨端口访问多个SE网站。我看到您对超级用户有一个正确的答案。
user619714 2014年

嗨,我已经在SuperUser上发布了相同的问题,askubuntu也是如此。我有点急于得到答案。这有什么问题吗?
Uvais Ibrahim 2014年

是的,请不要这样做,因为它分散了答案,并被皱了皱眉。另外,您发现复制时可能会出错,这很麻烦。只是不要这样做。
user619714 2014年

感谢Lain的关注。我是所有这些的初学者。
Uvais Ibrahim 2014年

Answers:


3

缺少额外的报价层。sed &在替换中具有特殊含义(代表匹配的字符串)。因此,要插入文字,&您只需将其转义一次,而要插入文字\&,则可以对反斜杠(\\)和&符号(\\&)进行转义,与之前的反斜杠相同$。那给你:

#!/bin/bash
dothis(){
    rootpass="${1//\$/\\\\$}"
    rootpass="${rootpass//&/\\\\\&}"
    echo $rootpass
    sed -i "s/root/$rootpass/g" test.txt
}
dothis 'my&rootpa$$';

不为我工作:${$1//&/\\\\\&}: bad substitution
Crisboot,2016年

0

您应该更改此行:

dothis "my&rootpa$$";

dothis "my&rootpa\$\$";

或使用引号而不是双引号:

dothis 'my&rootpa$$';

在您的情况下,$$in字符串my&rootpa$$将扩展为脚本本身的PID。


正如OP所说,直到最后一个sed命令一切正常,此时$ rootpass是my\&rootpas\$\$问题变量扩展。
user619714 2014年

0

这个“ dothis "my&rootpa$$"双引号引起来,” $$“末尾将扩展为当前的PID。当我执行脚本时,会发生以下情况:

 $ ./a.sh 
 我\&rootpa3595

...因为“ 3595”恰好是脚本的PID。当使用单引号('')时,将打印您期望的字符串:

 $ tail -1 a.sh 
 这样做'my&rootpa $$';

 $ ./a.sh 
 我\&rootpa \ $ \ $

请注意问题的最后一段,它表明$$没有被扩展...看一下OPs问题的修订版1,它显示了不正确的sed命令,我也怀疑其他转录错误。
user619714 2014年

另外,您还没有完成最终的sed操作,这就是问题所在。
user619714 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.