Posted by q3it on domingo, enero 22, 2023 in Linux
Una vez se ha hablado del comando grep y de las expresiones regulares que nos han ayudado a buscar contenido dentro de los ficheros, ahora lo siguiente, es que cuando encontremos algo modificarlo por algún valor que nosotros queramos. Para eso vamos a utilizar el comando sed, comando que viene del inglés "Stream editor" lo que significa "editor de flujo de datos", nosotros vamos a buscar una expresión y reemplazarla por otra o si encontramos algo eliminar esa línea y no visualizarla.
la sintaxis de sed va acompañada de una opción, luego de una expresión y el fichero en el que nosotros queremos busca esta expresión. Vamos a ver dos tipos: una es sustitución, que es buscar algo y reemplazarlo por otra y la otra es borrado, es decir nosotros encontramos algo y no queremos que se visualice.
Lo primero que vamos a ver es sustitución y nosotros siempre vamos a abrir comillas simples o dobles cuando estamos trabajando con la expresión, va ir la letra S indicando que vamos a hacer una sustitución y luego los separadores que van a ser barras verticales, en la primera opción va a ir el patrón que nosotros vamos a buscar, una letra, palabra, número o expresión regular y por lo que nosotros queremos reemplazarlo. Luego cerramos la tercera barra vertical y luego habrá modificadores, esos modificadores pueden ser g para cambiar todas las coincidencias que hemos buscado con patrón y con la opción i no va a distinguir entre mayúsculas y minúsculas.
Imaginemos que tenemos un fichero llamado empresa.txt en el que la empresa nos está diciendo que será nuestro año, que también será suyo, que nos subirán el sueldo y lo único que quieren es cambiar es 2023 por 2024.
Entonces lo que vamos a hacer es poner el comando set abrimos unas comillas ponemos las letras s sustitución y ponemos el patrón, en este caso nosotros queremos cambiar 2023 por 2024, cerramos la barra vertical, tiene que haber tres para la sustitución y luego indicamos el fichero en el que nosotros queremos hacer el cambio.
Como vemos nos ha cambiado varios 2023 por 2024 pero tenemos que el segundo 2023 no lo ha modificado ¿porqué? el comportamiento normal cuando estamos haciendo sustituciones es cambiar la primera coincidencia que ha encontrado para ello. Si nosotros queremos cambiar todos los 2023 tenemos que añadir un modificador para que sustituya todo. En este caso el modificador que tenemos que utilizar es la letra g, simplemente añadiendo después de la última barra vertical modificará todos los 2023 por 2024.
La siguiente expresión cuando trabajamos con sed es el borrado y funciona así... Abrimos comillas, luego una barra vertical, el patrón que queremos buscar, cerramos con barra vertical y de modificador elegiremos la letra d. Por ejemplo, si queremos borrar las líneas vacías sabríamos hacerlo con grep, utilizamos grep con opción -v para cambiar el comportamiento, es decir no queremos listar las líneas en blanco, en este caso, ponemos que la línea empieza y termina. Entonces significa que está vacía y luego nuestro fichero, vemos que está visualizando las líneas sin los espacios.
Si nosotros queremos utilizar el comando sed lo haremos, sed, abrimos las comillas especificaremos la expresión que nosotros queremos buscar, en este caso, línea vacía y con la letra d las eliminaremos, el nombre del fichero y veremos que tiene el mismo comportamiento.
Pero hasta ahora todos los comandos que hemos visto eran de visualización, de búsqueda pero no están modificando el fichero el que estamos trabajando, simplemente visualiza las modificaciones pero el fichero sigue intacto, pero el comando sed nos proporciona la opción -i que es para reemplazar el contenido del fichero en vez de visualizarlo. Lo que hará es trabajar con el contenido de este fichero, si queremos reemplazar 2023 por 2024 simplemente activamos la opción -i, ahora si vemos el contenido del fichero veremos que se han cambiado los 2023 por 2024.
Pero esto es muy peligroso porque si nosotros tenemos algún error en nuestra expresión a lo mejor estamos modificando cosas que nosotros no queremos y como estamos trabajando con el fichero original y si nosotros no tenemos ninguna copia de seguridad estaremos perdiendo los datos y restaurarlo nos llevaría tiempo.
Por suerte el comando el comando sed nos proporciona con la opción -i poder especificar una extensión, esto es lo que hará es, antes de realizar cualquier modificación creará una copia de seguridad con esta extensión y luego hará el reemplazo en el documento original.
Imaginemos que ahora nosotros tenemos este contenido con 2024 y queremos cambiar 2022. Pues nosotros añadimos la extensión para nuestra copia de seguridad, por ejemplo, le ponemos .copy al archivo original y presionamos el intro y veremos que tenemos dos documentos. El primero no es modificado que es el documento copy y luego el segundo que nosotros tenemos sin extensión es el que contiene la modificación.
Si nosotros nos hemos equivocado simplemente podemos restaurar este fichero que es el que tenía el contenido original y podemos hacerlo las veces que nosotros queramos, es decir, nosotros podemos volver a hacer alguna modificación del fichero y se volverá a crear. Entonces vemos que es una forma segura de hacer las modificaciones siempre que utilicemos -i.
Además el comando sed igual que con grep nos permite con la opción -F activar las expresiones regulares extendidas es decir si nosotros queremos utilizar las repeticiones o las agrupaciones nosotros podemos utilizar la opción -F mayúscula.