Pregunta Cómo pasar una variable que contiene barras inclinadas a sed


De hecho, sé la respuesta a esta pregunta, sin embargo, más de una vez he visto a algunos de mis colegas atascados en este tema, así que pensé que valdría la pena documentarlo en SO. Si la pregunta ya existe, con gusto la eliminaré.

Así que aquí va ...

¿Cómo se pasa una variable que contiene barras como un patrón para sed.

Por ejemplo, si tengo la siguiente variable:

var="/Users/Documents/name/file"

Quiero pasarlo a sed como tal:

sed "s/$var/replace/g" $file

Sin embargo, recibo errores. ¿Cómo puedo eludir el problema?


50
2018-01-05 20:41


origen


Respuestas:


Use un delimitador de expresiones regulares alternativo como sed le permite usar cualquier delimitador (incluyendo los personajes de control)

sed "s~$var~replace~g" $file

89
2018-01-05 20:41



Una respuesta pura bash: uso expansión de parámetros to backslash-escape cualquier barra inclinada en la variable:

var="/Users/Documents/name/file"
sed "s/${var//\//\\/}/replace/g" $file

29
2018-01-05 22:02



Otra forma de hacerlo, aunque más fea que la respuesta de Anubhava, es escapar todas las barras invertidas en var usando otro sed mando:

var=$(echo "$var" | sed 's/\//\\\//g')

entonces, esto funcionará:

sed "s/$var/replace/g" $file

24
2018-01-05 23:45



Utilizando / in sed como un delimitador entrará en conflicto con las barras en la variable cuando se sustituya y, como resultado, obtendrá un error. Una forma de eludir esto es usar otro delimitador que sea exclusivo de cualquier carácter que esté en esa variable.

var="/Users/Documents/name/file"

puedes usar el personaje de octothorpe que se adapte a la ocasión (o cualquier otro personaje que no sea / para facilidad de uso)

sed "s#$var#replace#g" 

o

  sed 's#$'$var'#replace#g'

esto es adecuado cuando la variable no contiene espacios

o

sed 's#$"'$var'"#replace#g'

Es más prudente utilizar lo anterior, ya que estamos interesados ​​en sustituir lo que está en esa variable solo en comparación con el doble de todo el comando que puede hacer que tu caparazón interfiera con el shell cualquier carácter que pueda considerarse un carácter de shell especial.


6
2018-01-05 23:59



El delimitador alternativo funciona solo cuando hay necesidad de buscar y reemplazar. En casos como donde hay necesidad de eliminar líneas de un archivo en función de la palabra que contiene / (ej. /dev/sda1) no funcionará Por ejemplo:

var1=/dev/sda1
sed -i ":$var1:d" $file 

Me gustaría ir con la solución propuesta por @Bolboa


0
2018-06-01 00:28