¿Cómo usar sed para sustituir cadenas que contienen "\"?

¿Cómo usar sed para sustituir cadenas que contienen "\"?

tengo un archivo llamadoMiArchivo.txtcon los siguientes contenidos:

Nombre de usuario=mi nombre de usuario
Contraseña cifrada=9k3S+sS3g\=\=

Cada vez que necesito cambiar el nombre de usuario y la contraseña ejecuto un script de shell. En el script de shell almaceno el nombre de usuario y la contraseña guardados en dos variables, a saber:

antiguonombredeusuario="minombredeusuario"
antiguacontraseña="9k3S+sS3g\=\="

nuevonombredeusuario="minuevonombredeusuario"

nuevacontraseña="U8djlk+h\=="

sed -i "s/$antiguo nombre de usuario/$nuevo nombre de usuario/g" MiArchivo.txt

sed -i "s/$contraseña antigua/$contraseñanueva/g" MiArchivo.txt

El primer sed funciona correctamente y reemplaza el nombre de usuario; sin embargo, el segundo comando sed no funciona y la contraseña no se cambia en el archivo. Creo que es por el carácter "\" presente en las variables.

¿Alguien podría ayudarme con esto y decirme cómo hacerlo?

Gracias..

Respuesta1

Solución estúpida, escapar de todas las barras invertidas:

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

Respuesta2

$ 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 \Qyq()

Devuelve el valor de EXPR con todos los caracteres ASCII que no sean "palabras" con barra invertida. (Es decir, todos los caracteres ASCII que no coincidan con /[A-Za-z_0-9]/ estarán precedidos por una barra invertida en la cadena devuelta, independientemente de la configuración regional). Esta es la función interna que implementa el escape \Q en doble -cadenas entre comillas

Una vez que el resultado sea correcto, utilícelo perl -i -pepara la edición in situ, igual quesed

Respuesta3

¿Se ha hecho eco del contenido de $oldpassword? Faltarán las barras invertidas en $oldpassword,

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

Como tal, el partido fracasará.

Si desea que los caracteres de barra invertida estén allí, coloque comillas simples alrededor del valor que asigna a contraseña anterior para evitar que el shell los interprete como secuencias de escape, es decir, convierta el valor en una cadena literal.

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

información relacionada