我创建了一个 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\$\$.