Como usar o sed para substituir strings que tem “\” nele? [duplicado]

1

Eu tenho um arquivo chamado MyFile.txt com o seguinte conteúdo:

Username=myusername
EncryptedPassword=9k3S+sS3g\=\=

Sempre que preciso alterar o nome de usuário e a senha, executo um script de shell. No shell script eu armazeno o nome de usuário e a senha para salvar duas variáveis, a saber:

oldusername="myusername"
oldpassword="9k3S+sS3g\=\="

newusername="mynewusername"

newpassword="U8djlk+h\=="

sed -i "s/$oldusername/$newusername/g" MyFile.txt

sed -i "s/$oldpassword/$newpassword/g" MyFile.txt

O primeiro sed funciona corretamente e substitui o nome de usuário, no entanto, o segundo comando sed não funciona e a senha não é alterada no arquivo. Eu acho que é por causa do caractere "\" presente nas variáveis.

Alguém poderia me ajudar com isso e me avisar sobre como fazer isso?

Obrigado ..

    
por Abraham Jaison 27.09.2016 / 14:32

3 respostas

0

Solução alternativa estúpida, escape de todas as barras invertidas:

oldpassword="$(printf "$oldpassword" | sed 's/\/\\/g')"
sed -i "s/$oldpassword/$newpassword/g" MyFile.txt
    
por 27.09.2016 / 14:52
0
$ cat MyFile.txt 
Username=myusername
EncryptedPassword=9k3S+sS3g\=\=
$ oldusername="myusername"
$ oldpassword="9k3S+sS3g\=\="
$ newusername="mynewusername"
$ newpassword="U8djlk+h\=="

$ perl -pe "s/\Q$oldusername/q($newusername)/e ; s/\Q$oldpassword/q($newpassword)/e" MyFile.txt
Username=mynewusername
EncryptedPassword=U8djlk+h\==

De perldoc de \Q e q()

Returns the value of EXPR with all the ASCII non-"word" characters backslashed. (That is, all ASCII characters not matching /[A-Za-z_0-9]/ will be preceded by a backslash in the returned string, regardless of any locale settings.) This is the internal function implementing the \Q escape in double-quoted strings

Quando o resultado estiver correto, use perl -i -pe para edição no local, o mesmo que sed

    
por 27.09.2016 / 14:59
-1

Você ecoou o conteúdo de $ oldpassword? As barras invertidas serão perdidas de $ oldpassword,

$ oldpassword=9k3S+sS3g\=\=
$ echo $oldpassword
9k3S+sS3g==

Assim, a correspondência falhará.

Se você quiser os caracteres de barra invertida, coloque aspas no valor que você atribuiu ao oldpassword para impedir que o shell interprete-as como seqüências de escape, isto é, torne o valor uma string literal,

$ oldpassword='9k3S+sS3g\=\=
    
por 27.09.2016 / 14:43