¿Por qué sed -i
ejecutado en enlace simbólico destruye ese enlace y lo reemplaza con el archivo de destino? ¿Cómo evitar esto?
p.ej.
$ ls -l pet*
-rw-rw-r-- 1 madneon madneon 4 mar 23 16:46 pet
lrwxrwxrwx 1 madneon madneon 6 mar 23 16:48 pet_link -> pet
$ sed -i 's/cat/dog/' pet_link
$ ls -l pet*
-rw-rw-r-- 1 madneon madneon 4 mar 23 16:48 pet
-rw-rw-r-- 1 madneon madneon 4 mar 23 16:49 pet_link
¿Y por qué no se considera un error?
No es un error, esto es por diseño ya que
sed
es un S TREAM ED itor, no un editor de archivos. Básicamente hace una copia y reemplaza el archivo original con la copia. BashFAQAlternativamente, puede usar el
ex
comando que tiene una sintaxis similar para la sustitución, por ejemploo múltiples archivos:
No destruirá los enlaces simbólicos.
Relacionado: ¿Cómo evito que sed destruya enlaces duros?
fuente
Me parece que esto también funciona bien (preservando los enlaces simbólicos y duros):
fuente
Hay una solución que a veces usamos para escribir en el mismo archivo que se lee. Aquí hay un extracto de la página del manual:
Aquí hay un fragmento que muestra que puede preservar enlaces simbólicos, aunque generalmente lo uso para preservar inodes:
que produce:
En un sistema como:
El código de la esponja está disponible en un paquete moreutils , algunos detalles:
En nuestra tienda, escribimos una versión que escribe en un archivo temporal para el caso de archivos muy grandes.
El paquete está disponible en Debian, Fedora, macOS (a través de brew), etc. ... saludos,
fuente