Necesito reemplazar la ruta de Unix a través de sed con una variable que contenga otra ruta de Unix en un script bash
Ejemplo:
another_unix_path=/another/unix/path
sed -i 's/ \/some\/path\/file.txt/ '$another_unix_path'/g' some_file.txt
Respuesta1
Necesitas escapar de los caracteres especiales:
another_unix_path="\/another\/unix\/path"
echo /some/path/file.txt | sed -e 's/\/some\/path\/file.txt/'$another_unix_path'/g'
Lo que genera este resultado:
/otro/unix/ruta
Respuesta2
Escapar del carácter especial /
es una opción.
También puedes cambiar el sed
separador predeterminado (que es /
) usando ?
, por ejemplo:
another_unix_path="/another/unix/path"
echo /some/path/file.txt | sed -e 's?/some/path/file.txt?'$another_unix_path'?g'
El carácter utilizado justo después de la s
bandera define qué separador se utilizará:s?
Editar :
#!/bin/sh
basepath=/another/unix/path
baseurl=/base/url
sed -i 's?# set $IMAGE_ROOT /var/www/magento2;? set $IMAGE_ROOT '$basepath$baseurl';?g' somefile.txt
Respuesta3
Si usas /
separadores, tendrás que escapar de todos los que encuentres /
en tu camino, por ejemplo.sed 's/\/some\/path/'$replacement'/g'
Afortunadamente, sed, al igual que Perl, permite usar muchos caracteres como separadores, por lo que también puedes escribir sed 's#/some/path#'$replacement'#g'
(la g
bandera se usa para permitir reemplazar múltiples apariciones por línea).
Además, sed no permitirá el reemplazo in situ si lo ejecuta en un archivo, lo que significa que tendrá que escribir en un archivo temporal y moverlo. Actualizar:en realidad, el sed de Gnuhacetiene una opción local que funciona como la de Perl: -i
o -i.ext
dónde .ext
está la extensión de respaldo. Sin embargo, Perl puede ser preferible para la portabilidad.
Para el reemplazo in situ, puede utilizar Perl como tal:
# In-place without backup:
perl -pi -e 's#/some/path#'$replacement'#g' <file>
# In-place with backup as .orig (note .orig is glued to the -i switch):
perl -pi.orig -e 's#/some/path#'$replacement'#g' <file>
¡Tenga cuidado con el segundo comando, ya que si lo ingresa dos veces sobrescribirá su primera copia de seguridad!