Script Bash, cannote replace string em um arquivo com escape $ e &

0

Eu criei um script de shell que usa uma string como entrada. Se a string contiver '$' ou '& amp;', será necessário substituir esses caracteres por '\ $' e '\ & amp;'. Eu poderia fazer isso com o comando sed. Depois disso, quero substituir uma palavra em um arquivo de texto específico por essa string correspondente.

Por favor, consulte esta seção para mais esclarecimentos.

Este é o meu arquivo.

test.txt

hello my root password is root.

Agora, quero alterar a palavra raiz com uma string. A string pode ser qualquer coisa que inclua caracteres especiais, como $ ou & amp;.

Se eu quiser substituir o root pela string my&rootpa$$ , ele deve se parecer com my\&rootpa\$\$ no arquivo de texto.

Este é o meu scipt 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$$";

Esse script funciona corretamente até echo $rootpass , o que significa que quando eu fizer eco da string, ele exibirá meu \ & amp; rootpa \ $ \ $. Mas no arquivo, parece o meu & amp; rootpa $$ em vez do meu \ & amp; rootpa \ $ \ $. O que há de errado com o script?

Por favor, conselhos.

    
por Uvais Ibrahim 22.01.2014 / 07:57

1 resposta

1

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\$\$.
    
por chaos 22.01.2014 / 08:24