Como usar o sed para substituir strings que contenham "\"?

Como usar o sed para substituir strings que contenham "\"?

Eu tenho um arquivo chamadoMeuArquivo.txtcom o seguinte conteúdo:

Nome de usuário=meunomedeusuário
Senha Criptografada=9k3S+sS3g\=\=

Cada vez 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 salvos em duas variáveis, a saber:

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

novo nome de usuário = "meu novo nome de usuário"

nova senha="U8djlk+h\=="

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

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

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

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

Obrigado..

Responder1

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

oldpassword="$(printf "$oldpassword" | sed 's/\\/\\\\/g')"
sed -i "s/$oldpassword/$newpassword/g" MyFile.txt

Responder2

$ 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\==

DeperldocPara \Qeq()

Retorna o valor de EXPR com todos os caracteres ASCII não "palavras" com barras invertidas. (Ou seja, todos os caracteres ASCII que não correspondam a /[A-Za-z_0-9]/ serão precedidos por uma barra invertida na string retornada, independentemente de quaisquer configurações de localidade.) Esta é a função interna que implementa o escape \Q em duplo -strings entre aspas

Quando o resultado estiver bom, use perl -i -pepara edição local, da mesma forma quesed

Responder3

Você repetiu o conteúdo de $ oldpassword? As barras invertidas estarão faltando em $oldpassword,

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

Como tal, a partida irá falhar.

Se você quiser os caracteres de barra invertida, coloque aspas simples ao redor do valor atribuído a oldpassword para impedir que o shell os interprete como sequências de escape, ou seja, torne o valor uma string literal,

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

informação relacionada