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
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 ..
$ 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
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\=\=
Tags sed shell-script