sed - signo - simbolo del euro
escapando del signo de dólar (3)
El uso de $
como un carácter literal puede necesitar ser escapado, pero no como un ancla que significa el final de la cadena.
Por cierto, su expresión regular sería mucho más fácil de leer si utilizó un delimitador diferente, por lo que no tuvo escape de /
en la expresión regular
sed -i `''s|/var/lib/mysql/|/var/lib/mysql13307/|'' /etc/my.cnf
Tengo una línea en el archivo my.cnf
datadir = /var/lib/mysql
Lo siguiente lo cambia a mysql3307 como se esperaba.
sed -i ''s///var//lib//mysql$///var//lib//mysql3307/'' /etc/my.cnf
Pero si tengo lo siguiente:
datadir = /var/lib/mysql/
Entonces, lo siguiente no cambia la ruta como se esperaba:
sed -i ''s///var//lib//mysql//$///var//lib//mysql3307/'' /etc/my.cnf
Quiero cambiar la ruta a mysql3307 donde datadir es / var / lib / mysql (con o sin /)
Actualizar:
Aquí está el problema: ambos comandos anteriores funcionan en un servidor y ninguno de ellos funciona en otro.
El siguiente funciona como se esperaba, pero necesito agregar $ para indicar las líneas que terminan en mysql /
sed -i ''s///var//lib//mysql/////var//lib//mysql3307/'' /etc/my.cnf
Observado:
El signo de carot ^ funciona como se esperaba, pero el signo de final de línea no. ¿Cualquier pista?
Actualizar:
Parece estar funcionando después de usar el comando "dos2unix".
Si específicamente desea cambiar solo el valor del datadir
, el siguiente comando es más razonable:
sed -i.bak ''s| *datadir *=.*|datadir = /var/lib/mysql3306/|g'' /etc/my.cnf
Nota: -i.bak
la copia de seguridad del archivo original con el sufijo .bak
antes de realizar el cambio.
Si su intención es cambiar solo las rutas que tienen ese directorio específico, debe ser un poco más complicado. Tienes que atraparlo al final de una línea sin el final /
y también tienes que atraparlo en todos los lugares donde tiene el final /
(final de línea o no).
Pero no quiere ver cosas como /var/lib/mysqlplus
ya que es un directorio totalmente diferente .
Considere el uso de expresiones regulares extendidas y el uso de un carácter separador diferente para que el comando no se vea como sawteeth ( ////////////////
). Con esos cambios, y una pequeña modificación a la expresión regular en sí misma, funciona bien:
$ echo ''
/var/lib/mysqlplus
/var/lib/mysql/
/var/lib/mysql
/var/lib/mysql/xyz'' | sed -E ''s|/var/lib/mysql([$/])|/var/lib/mysql3307/1|''
/var/lib/mysqlplus
/var/lib/mysql3307/
/var/lib/mysql
/var/lib/mysql3307/xyz