Bash 脚本,无法替换文件中带有转义的 $ 和 & 的字符串

Bash 脚本,无法替换文件中带有转义的 $ 和 & 的字符串

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

请参阅本节以了解更多说明。

这是我的文件。

test.txt

hello my root password is root.

现在,我想用字符串更改单词 root。字符串可以是任何内容,其中可能包括特殊字符,例如 $ 或 &。

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

这是我的 shell 脚本

#!/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\$\$。脚本有什么问题。

请指教。

答案1

您必须多次转义$和,因为使用命令时它们也需要转义。如果不多次转义,它们将被解释为单个和符号。&sed -i&$

#!/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$$';

这对我有用。输出是:

my\\\&rootpa\\\$\\\$

执行后测试如下:

user@host:~# cat test.txt
hello my my\&rootpa\$\$ password is my\&rootpa\$\$.

相关内容