Tutoriel Linux

Sed en Linux: reemplazar texto en un archivo sin destruir el original.

Débutant6 min de lecture
À retenirLinux n'est pas réservé aux experts. Le bon point de départ : une distribution accessible, une sauvegarde propre et quelques commandes comprises.

Reemplazar texto en un archivo Linux con sedEs muy práctico. Sin embargo, es el tipo de comando que puede dañar un archivo de configuración en un segundo si se ejecuta directamente. sed -i releído mal.

Te aconsejo que adoptes un hábito sencillo: leer antes de escribirProbamos la sustitución en la salida estándar, la redirigimos a un archivo temporal, verificamos las diferencias y solo entonces reemplazamos el original. Es un poco más largo, pero en un servidor evita reparaciones innecesarias.

Tux comprueba un archivo de Linux antes de reemplazar el texto con sed.
Siempre pruebe una sustitución con sed antes de modificar el archivo original.

Comprender qué cambios sed realmente se producen

sed Lee un flujo de texto, aplica una regla y luego muestra el resultado. Por defecto, no modifica el archivo de origen. Este es precisamente el comportamiento que se debe usar al probar un comando.

sed 's/old/new/' archivo.conf

Este comando reemplaza la primera aparición de antiguo por nuevo en cada línea mostrada. El archivo archivo.conf permanece intacto. Así que puedes ver el resultado sin correr ningún riesgo.

Si desea reemplazar todas las ocurrencias en una línea, agregue la bandera. gramo :

sed 's/old/new/g' archivo.conf

El error clásico es confundir ambos. Sin gramo`sed` solo reemplaza la primera aparición de cada línea. Con gramoReemplaza todas las apariciones que se encuentren en la línea.

Prueba en un archivo nuevo antes de modificar el original.

Para un archivo de configuración, prefiero crear un archivo de prueba. Así, conservas el original y puedes compararlo cuando quieras.

sed 's/old/new/g' file.conf > file.conf.new

diff -u archivo.conf archivo.conf.nuevo

EL diferencia -u Te muestra exactamente qué líneas se han modificado. Si el resultado es correcto, puedes reemplazar el archivo antiguo.

Mover archivo.conf.nuevo archivo.conf

Para archivos confidenciales, haga siempre una copia fechada antes de manipularlos:

cp archivo.conf archivo.conf.bak-$(fecha +%F-%H%M)

No se trata de una verdadera estrategia de copia de seguridad, pero a menudo es suficiente para volver al estado anterior tras un pequeño error de reemplazo.

Usa sed -i sin jugar con fuego

la opción -i Modifica el archivo directamente. Es práctico, pero jamás lo usaría en un archivo importante sin una copia de seguridad o pruebas previas.

El requisito mínimo es pedirle a sed que cree una copia de seguridad:

sed -i.bak 's/old/new/g' archivo.conf

Luego obtienes el archivo modificado, más una copia. archivo.conf.bakSi la sustitución causó algún problema, puede restaurarlo rápidamente:

mv archivo.conf.bak archivo.conf

En algunas distribuciones o en macOS, el comportamiento de sed -i puede variar. En Linux GNU sed, -i.bak Funciona bien. Si está escribiendo un procedimiento destinado a varios sistemas, pruébelo siempre en una copia.

Reemplazar una ruta sin tener que lidiar con barras diagonales.

Cuando la cadena contiene /La sintaxis clásica se vuelve rápidamente ilegible:

sed 's#/var/www/html#/srv/www/site#g' nginx.conf > nginx.conf.test

Aquí yo uso # como separador en lugar de /El comando resulta más claro y se evitan una serie de tediosas operaciones de escape. Esto es muy útil para rutas, URL o ciertas variables de configuración.

Antes de aplicar este cambio a un archivo de Nginx, Apache o de aplicación, compruebe las líneas afectadas:

diff -u nginx.conf nginx.conf.test

grep -n '/srv/www/site' nginx.conf.test

Si modifica la configuración de un servicio, realice también una prueba específica para dicho servicio antes de reiniciarlo. Sed reemplaza el texto; no valida la sintaxis de su aplicación.

Mostrar solo las filas relevantes

Para inspeccionar un archivo antes de modificarlo, puede combinar sed Y grepSi desea mostrar un rango de filas:

sed -n '1,80p' archivo.conf

EL -norte evita mostrar el archivo completo. pag Solo imprime el rango solicitado. Esto resulta útil para controlar un área específica en una configuración extensa.

Para mostrar las líneas que coinciden con un patrón:

sed -n '/server_name/p' nginx.conf

Si su principal necesidad es buscar dentro de los archivos, grep suele seguir siendo más natural.Sed se vuelve interesante cuando necesitas transformar el resultado, no solo encontrarlo.

Modifique varios archivos con precaución.

Sed puede tentarte rápidamente a modificar una carpeta completa. En este caso, te aconsejo que vayas con calma. Empieza por listar los archivos que contienen la cadena que buscas:

grep -rl 'old' /etc/my-app

A continuación, ejecuta un bucle que guarde cada archivo antes de reemplazarlo:

grep -rl 'old' /etc/my-app | while read -r file; do
  cp "$file" "$file.bak"
  sed -i 's/ancien/nouveau/g' "$archivo"
hecho

Este no es un comando para copiar ciegamente en /etcAdapta la carpeta, comprueba la lista con grep-rlLuego, trabaje en un ámbito limitado. Para buscar archivos antes de realizar una acción, también puede utilizar encontrar en Linux.

Comprobaciones posteriores al reemplazo

Tras realizar una sustitución, no dé por hecho que el pedido se ha realizado. Al menos compruebe estos puntos:

  • la presencia del nuevo valor con grep -n 'nuevo' archivo.conf ;
  • la ausencia del antiguo valor con grep -n 'old' file.conf ;
  • la diferencia entre el archivo original y el modificado si se conserva una copia;
  • la prueba de sintaxis de la aplicación en cuestión, cuando existe;
  • los registros del servicio después de recargar o reiniciar.

Para los registros, tenga en cuenta que debe monitorear lo que está sucediendo en vivo con cola O journalctl -fSed puede corregir un valor, pero solo el servicio le indicará si la configuración sigue siendo válida.

Cuándo evitar sed

Sed es perfecto para realizar sustituciones sencillas en un archivo de texto. Recomendaría evitar su uso para modificar un archivo estructurado si el orden, los bloques o las comillas son cruciales. Para JSON, YAML complejo, XML o configuraciones muy sensibles, una herramienta específica o un pequeño script podrían ser más seguros.

Si está preparando una migración o una corrección que afecte a varios archivos, haga una copia de seguridad completa con antelación. Un archivo o una copia local pueden ser una solución temporal, pero para una copia de seguridad real y regular, utilice un método fiable como sincronización.

Para ir más allá, el Manual de GNU sed y la pagina sed(1) de man7.org Lo que queda son las referencias útiles. Son menos prácticas que un ejemplo concreto, pero aclaran rápidamente las opciones cuando se va más allá de simples sustituciones.

sudo apt update && sudo apt upgrade