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 \Q
eq()
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 -pe
para 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\=\=