simbolo signo peso origen estadounidense dólar donde dolar chileno argentina americano sed awk grep

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