Los administradores de sistemas Linux nos enfrentamos constantemente al problema de tener que cambiar un valor en varios ficheros de configuración a la vez, los cuales tienen siempre el formato de texto plano. Por ejemplo, si cambiamos la IP o el nombre de un equipo, hay que recorrerse todo el directorio /etc
en busca de ficheros que contengan una referencia al dato antiguo y cambiarla por el nuevo. Esto, que evidentemente es un proceso tedioso si hay que hacerlo a mano, podemos afortunadamente automatizarlo con una de las herramientas de procesamiento de texto que Linux incluye de serie y que ha heredado de Unix: sed
.
sed
es una utilidad de línea de comandos y nos permite con una sintaxis muy sencilla sustituir una cadena de texto por otra, que incluso permite utilizar expresiones regulares para aplicar la sustitución a patrones de cadenas. La operación más básica de sed
tendría la siguiente forma:
# sed 's/antigua/nueva/g' fichero_original > fichero_nuevo
Si no queremos crear un fichero nuevo sino cambiar el existente, incluimos el parámetro -i
:
# sed -i 's/antigua/nueva/g' fichero_original > fichero_nuevo
Veamos entonces el ejemplo mencionado de tener que sustituir el nombre del sistema por uno nuevo. Para ello, realizaremos una búsqueda en /etc
y modificaremos los ficheros que contengan la cadena a cambiar.
# grep -r -H equipo1 /etc | cut -f 1 -d ":" | xargs sed -i 's/equipo1/equipo2/g'
En la línea anterior combinamos varios comandos Linux para prepara la lista de ficheros a procesar y obtener el resultado deseado con sed
:
grep
hace una búsqueda recursiva (-r
) en el directorio/etc
e imprime los nombres de lo ficheros coincidentes (-H
).cut
extrae la primera columna (-f
) indicando:
como separador de las mismas (-d
).xargs
recibe la lista de ficheros y se le pasa ased
uno a uno (si nosed
actuaría sobre toda la lista a la vez, lo cual no puede hacer).- Finalmente
sed
realiza la sustitución.
Este truco es también muy útil para los desarrolladores web, por ejemplo para actualizar plantillas o código fuente. Un aviso: hay que asegurarse de que la cadena a sustituir SÓLO aparece en los ficheros que nos interesan, ya que podemos sufrir el efecto secundario de cambiar lo que no deberíamos.
Espero que os sea de utilidad. Hasta el truco de la semana que viene.