Você tem que escapar $
e &
várias vezes, porque ao usar o comando sed -i
eles precisam ser escapados também. Se não tiver escapado várias vezes, elas serão interpretadas como sinais únicos &
e $
.
#!/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$$';
Isso funcionou para mim. A saída é:
my\\&rootpa\\$\\$
E o teste é assim após a execução:
user@host:~# cat test.txt
hello my my\&rootpa\$\$ password is my\&rootpa\$\$.