¿Cómo escapar de la ruta del archivo en SED?

40

Me gustaría sustituir $fileWithPathen $file, sin embargo, esto no funciona porque (creo) camino no se escapó. ¿Cómo escapar de eso?

sed -i 's/${fileWithPath}/HAHA/g' $file
Adaptador UA
fuente

Respuestas:

72
sed -i 's|'$fileWithPath'|HAHA|g' file

Las comillas simples definen un literal de cadena. Poner la variable fuera del literal permite que el shell expanda esa parte.

Además: si va a analizar rutas, use un delimitador en el comando sed que no confunda con el delimitador de directorio "/".

ata
fuente
1
Tenga en cuenta que si $fileWithPathcontiene espacios en blanco, se inserta el patrón incorrecto.
Lekensteyn
¡Su consejo adicional sobre cambiar el delimitador para rutas de archivos fue un salvavidas!
Shadoninja
Creo que tienes demasiadas citas en tu comando. Mi ejemplo sed -i 's|auth-user-pass nordvpn.txt|auth-user-pass /etc/openvpn/nordvpn.txt|g' *.ovpnparece funcionar.
Léo Léopold Hertz 준영
15

Una mejor manera de cadenas literales con barras diagonales:

sed -i "s|my/path|my/other/path|g" myFileOfPaths.txt
Jeff Lancaster
fuente
¡Este merecía un Oscar! Simple y elegante
Toan Nguyen
15

En circunstancias en las que la cadena de reemplazo o la cadena de patrón contienen barras, puede utilizar el hecho de que GNU sed permite un delimitador alternativo para el comando sustituto. Las opciones comunes para el delimitador son el carácter de tubería | o el hash # : la mejor opción para delimitar caracteres a menudo dependerá del tipo de archivo que se procese. En tu caso puedes probar

sed -i 's#'$fileWithPath'#HAHA#g' $file

El carácter 'g' después del último # se usa para cambiar todas las ocurrencias en el archivo si necesita cambiar solo la primera aparición y luego eliminar la 'g'.

c0m3t
fuente