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