¿Cómo escapar caracteres dentro de una variable en sed?

Hace un tiempo os expliqué la forma de utilizar variables dentro de sed, ¿pero como hacemos si dentro del contenido de la variable hay caracteres que tienen que ser «escapados»? Por ejemplo:

#!/bin/bash
VARIABLE="/foo/bar/test"
sed "s/${VARIABLE}/foo/" fichero

Si lo ejecutamos:

sed: -e expression #1, char 8: unknown option to `s'

Lo que pasa es que como la variable tiene el carácter «/», deberíamos escaparlo «\/» para que no interfiriera en la sintaxis de sed. Para no complicarnos la vida, hay una forma más sencilla. Sed permite elegir el delimitador de los parámetros del comando, no tiene que ser «/» sino que puede ser otro (,=…). Para evitar el problema entonces podemos cambiar la ejecución de sed tal que así:

#!/bin/bash
VARIABLE="/foo/bar/test"
sed "s,${VARIABLE},foo," fichero

He elegido la «,» como delimitador de los parámetros, pero podríamos elegir otro, por ejemplo «#». La idea es utilizar un carácter que no esté dentro de la variable y que no interfiera con los caracteres especiales del comando:

sed "s#${VARIABLE}#foo#" fichero

6 comentarios en “¿Cómo escapar caracteres dentro de una variable en sed?

  1. Estoy estudiando lpic, nivel junior (a mi edad, que ya es decir), y al final he decidido picar en «seguir a @rm-rf.es», porque la mitad de las veces que busgo algo en San google encuentro un resultado de tu blog… (Ahora me llega aviso al correo con cada actualización del blog, y siempre me puede la curiosidad de ver qué de nuevo voy a aprender hoy en rm-rf).
    Buen truco para sed… ¿Es posible hacer lo mismo con grep y sus expresiones regulares?
    Como siempre, sencillo y bien explicado.
    A ver si termino con lpic y me llevas unos días de machaca contigo, porque mis ganas de aprender, y tu capacidad de explicarte iban a hacer buenas migas.
    Saludos y muchas gracias!!

    • Mucha suerte con el LPIC! con grep creo que no queda otra que «escapar» las variables.

      Y gracias por seguir el blog, me alegro de que te sirva y aprendas cosillas. Ahora escribo menos que antes por falta de tiempo pero aún así voy poniendo algunas cosillas que me pasan en el día a día.

      Saludos!

  2. ¡Vaya!, Que pena no haberlo sabido antes… En proyecto anteriores tuve que hacer escapes a rutas antes de usarlas con sed para evitar lo que mencionas.
    Gracias, ahora ya sé como debí de haberlo hecho mejor.

  3. Me funciono de maravilla, me dí cuenta en base a tu ejercicio que mi cadena contenía un / y por tanto
    me marcaba el mismo error. La solución con # me fue genial, el comando sed tiene sus trucos.

    Gracias, saludos.

Comments are closed.