sed reemplaza la ruta de Unix con una variable que contiene otra ruta de Unix

sed reemplaza la ruta de Unix con una variable que contiene otra ruta de Unix

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 sedseparador 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 sbandera 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 gbandera 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: -io -i.extdónde .extestá 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!

información relacionada