Archivos categorizados en: Mac OS X

Sustitución de texto con sed + regexp

Categoría(s): Debian, FreeBSD, GNU/Linux, Línea de comandos, Mac OS X, UNIX

Para esta tarea, usaremos el comando “sed”.

Cuento con un archivo como ejemplo, cuyo nombre es sed-prueba.txt, que contiene las siguientes líneas:

#Guia de instrucciones
1. Administracion Linux, Unix, Linux Scriting, etc.
2. Databases - Oracle, mySQL, etc.
3. Seguridad: Firewall, iptables, PF, etc.
4. Almacenamiento en Linux, etc
5. Windows- Sysadmin, reboot etc.

Se han dejado algunos errores a propósito para cubrir el objetivo de esta entrada.

Antes de proseguir, haré un breve reseña del comando:

Sed es un editor de flujo. Un editor de flujo se usa para realizar transformaciones básicas de texto.

Sed

  • sed es un editor  “no-interactivo” orientado a flujo. Ya que no es interactivo puede usar para automatizar ediciones.
  • El nombre Sed es una abreviación para “stream editor” y su utilidad se deriva de los comando del editor de línea ed.  (ed fue el primer editor en UNIX).
  • Esta característica  permite editar mútiples archivos o realizar operaciones comunes de edición de texto sin necesidad de abrir el archivo con vi o emacs.
  • sed lee desde el archivo o desde la consola y su salida se direcciona hacia la salida estandar.

Revisaremos como utilizar el comando de sustitución “s”.  Este comando probablemente sea el más importante dentro de la ejecución del sed, y cuenta con diferentes opciones.

El comando “s” intenta hallar coincidencia del patrón en relación a la expresión regular REGEXP.  Si la coincidencia es positiva, entonces la porción del patrón que se ha encontrado será cambiado con el reemplazo REPLACEMENT.

Sintaxis:

    $ sed ‘ADDRESSs/REGEXP/REPLACEMENT/FLAGS’ archivo

Otra sintaxis:

    $ sed ‘PATTERNs/REGEXP/REPLACEMENT/FLAGS’ archivo

veamos la explicación de la sintaxis:

  • s el comando de sustitución.
  • / el delimitador
  • REGEXP la expresión regular para buscar
  • REPLACEMENT el contenido a sustituir

FLAGS  puede ser cualquiera de los siguiente;

  • g reemplaza todas las instancias de REGEXP con REPLACEMENT
  • n podría ser cualquier número, reemplaza N número de instancias de REGEXP with REPLACEMENT
  • p si la sustitución se hizo, entonces muestra el nuevo patrón.
  • i realiza la búsqueda REGEXP en modo no sensitivo a caracteres
  • w salva en archivo si la sustitución fue hecha, muestra por consola el resultado del archivo dado
  • Puede usarse diferente delimitadores ( uno de  @ % ; : )  en vez de /

Tal como mencioné al principio,  ya tengo un archivo como ejemplo.  Si gusta puedes hacer una copia de éste y creas en tu propio computador un archivo y pegas, luego lo salvas con el nombre que te parezca. Así podría ser más práctico realizar las prueba tu mismo.  Aquí usaré sed-prueba.txt como nombre de archivo.

Ahora bién, mostremos el contenido,

user@computer:$ cat sed-prueba.txt
# Guia de instrucciones
1. Administracion Linux, Unix, Linux Scriting, etc.
2. Databases - Oracle, mySQL, etc.
3. Seguridad: Firewall, iptables, PF, etc.
4. Almacenamiento en Linux, etc
5. Windows- Sysadmin, reboot etc.

Comenzaré con algunos ejemplos para demostrar la acción de sustitución.

1.  Sustituir la palabra “Linux” por “GNU/Linux” usando sed s//

Es importante escapar los caracteres especiales cuando se realizan manejo de expresiones regulares. De lo contrario, podemos recibir errores como este:

user@computer:$ sed 's/Linux/GNU/Linux/' sed-prueba.txt
sed: -e expression #1, char 13: unknown option to `s'

Pues para situaciones donde el caracter a reemplazar se parece al delimitador, entonces la manera más adecuada para la sustitución es hacerlo así:

user@computer:$ sed 's/Linux/GNU\/Linux/' sed-prueba.txt
# Guia de instrucciones
1. Administracion GNU/Linux, Unix, Linux Scriting, etc.
2. Databases - Oracle, mySQL, etc.
3. Seguridad: Firewall, iptables, PF, etc.
4. Almacenamiento en GNU/Linux, etc
5. Windows- Sysadmin, reboot etc.

Se puede apreciar el cambio de la primera y cuarta línea. Ahora haré otra sustitución de la palabra “Scriting” por “Scripting”.

user@computer:$ sed 's/scriting/Scripting/' sed-prueba.txt
# Guia de instrucciones
1. Administracion Linux, Unix, Linux Scriting, etc.
2. Databases - Oracle, mySQL, etc.
3. Seguridad: Firewall, iptables, PF, etc.
4. Almacenamiento en Linux, etc
5. Windows- Sysadmin, reboot etc.

No se produjo cambio alguno. Ahora intentaremos de nuevo, pero esa vez haciendo caso omiso a  mayúscula o minúscula “case-sensitive”.

user@computer:$ sed 's/scriting/Scripting/i' sed-prueba.txt
# Guia de instrucciones
1. Administracion Linux, Unix, Linux Scripting, etc.
2. Databases - Oracle, mySQL, etc.
3. Seguridad: Firewall, iptables, PF, etc.
4. Almacenamiento en Linux, etc
5. Windows- Sysadmin, reboot etc.

2. Sustituir todas las apariciones de la palabra usando sed s//g

Voy a reemplazar todas las ocurrencias de la palabra “Linux” a “Linux-Unix” de manera global utilizando  el flag de sustitución “g”.

user@computer:$ sed "s/Linux/Linux-Unix/g" sed-prueba.txt
# Guia de instrucciones
1. Administracion Linux-Unix, Unix, Linux-Unix Scriting, etc.
2. Databases - Oracle, mySQL, etc.
3. Seguridad: Firewall, iptables, PF, etc.
4. Almacenamiento en Linux-Unix, etc
5. Windows- Sysadmin, reboot etc.

3. Sustituir sólo la segunda ocurrencia de la palabra usando sed s//2

Tomando el resultado anterior, en la línea “1. Administracion Linux-Unix, Unix, Linux-Unix Scriting, etc.”  sólo la 2da. ocurrencia de la palabra “Linux-Unix” será reemplazada por “LINUX”.

user@computer:$ sed "s/Linux-Unix/LINUX/2" sed-prueba.txt
# Guia de instrucciones
1. Administracion Linux-Unix, Unix, LINUX Scriting, etc.
2. Databases - Oracle, mySQL, etc.
3. Seguridad: Firewall, iptables, PF, etc.
4. Almacenamiento en Linux-Unix, etc
5. Windows- Sysadmin, reboot etc.

4. Salvar los cambios al archivo y mostrar los cambios realizados usando sed s//gpw

En este próximo ejemplo, la sustitución se realizará con tres FLAGS. Voy a sustituir todas las ocurrencias de “Linux-Unix” a “GNU/Linux”, mostrar los cambios y también grabar esos mismos cambios en otro archivo temporal.

user@computer:$ sed -n "s/Linux-Unix/GNU\-Linux/gpw archivo-temporal" sed-prueba.txt
1. Administracion GNU-Linux, Unix, GNU-Linux Scriting, etc.
4. Almacenamiento en GNU-Linux, etc

5. Sustituir sólo cuando la línea coincide con el patrón usando sed

En este ejemplo, sí la línea coincide con el patrón “-” entonces reemplazaré todos los caracteres desde el  “-”  y dejarlo en blanco.

user@computer:$ sed "/\-/s/\-.*//g" sed-prueba.txt
# Guia de instrucciones
1. Administracion Linux
2. Databases
3. Seguridad: Firewall, iptables, PF, etc.
4. Almacenamiento en Linux
5. Windows

Ahora haré otro ejemplo parecido, eliminando sólo el patrón “-”.  Aprecie la diferencia en la sintaxis.

user@computer:$ sed "/\-/s/\-/ /g" sed-prueba.txt
# Guia de instrucciones
1. Administracion Linux Unix, Unix, Linux Unix Scriting, etc.
2. Databases   Oracle, mySQL, etc.
3. Seguridad: Firewall, iptables, PF, etc.
4. Almacenamiento en Linux Unix, etc
5. Windows  Sysadmin, reboot etc.

6. Eliminar N número de caracteres en cada línea usando sed

Este ejemplo eliminará los últimos 3 caracteres de cada línea.

user@computer:$ sed "s/...$//" sed-prueba.txt
# Guia de instruccio
1. Administracion Linux-Unix, Unix, Linux-Unix Scriting, e
2. Databases - Oracle, mySQL, e
3. Seguridad: Firewall, iptables, PF, e
4. Almacenamiento en Linux-Unix,
5. Windows- Sysadmin, reboot e

7. Eliminar el comentario usando sed

Eliminar todas las líneas de comentarios de un archivo.

user@computer:$ sed -e "s/#.*//" sed-prueba.txt
1. Administracion Linux-Unix, Unix, Linux-Unix Scriting, etc.
2. Databases - Oracle, mySQL, etc.
3. Seguridad: Firewall, iptables, PF, etc.
4. Almacenamiento en Linux-Unix, etc
5. Windows- Sysadmin, reboot etc.

8. Eliminar Comentarios y Líneas vacías usando sed

En este ejemplo, hay dos comando separados por “;”

  • El primer comando reemplaza la línea comenzando con el caracter “#” a línea en blanco.
  • El segundo comando elimina las líneas vacías.
user@computer:$ sed -e "s/#.*//;/^$/d" sed-prueba.txt
1. Administracion Linux-Unix, Unix, Linux-Unix Scriting, etc.
2. Databases - Oracle, mySQL, etc.
3. Seguridad: Firewall, iptables, PF, etc.
4. Almacenamiento en Linux-Unix, etc
5. Windows- Sysadmin, reboot etc.

9. Eliminar etiquetas HTML de un archivo usando sed

Usaré otro archivo como ejemplo:

user@computer:$ cat prueba.html
<li>sed es un editor  “no-interactivo” orientado a flujo. Ya que no es interactivo puede usar para automatizar ediciones.</li>
<li>El nombre <strong>Sed</strong> es una abreviación para <strong>s</strong>tream <strong>ed</strong>itor y su utilidad se deriva de los comando del editor de línea <strong>ed</strong>.  (<strong>ed</strong> fue el primer editor en UNIX).</li>
<li>Esta característica  permite editar mútiples archivos o realizar operaciones comunes de edición de texto sin necesidad de abrir el archivo con <strong>vi</strong> o <strong>emacs</strong>.</li>
<li><strong>sed</strong> lee desde el archivo o desde la consola y su salida se direcciona hacia la salida estandar.</li>
</ul>

Con este ejemplo, la expresión regular dada en el comando sed busca la líneas que coincida con las etiquetas HTML y reemplaza con caracteres en blanco.

user@computer:$ sed -e "s/<[^>]*>//g" prueba.html
sed es un editor  “no-interactivo” orientado a flujo. Ya que no es interactivo puede usar para automatizar ediciones.
El nombre Sed es una abreviación para stream editor y su utilidad se deriva de los comando del editor de línea ed.  (ed fue el primer editor en UNIX).
Esta característica  permite editar mútiples archivos o realizar operaciones comunes de edición de texto sin necesidad de abrir el archivo con vi o emacs.
sed lee desde el archivo o desde la consola y su salida se direcciona hacia la salida estandar.

Trabajo a diario en una consola de comandos, y en situaciones de contigencia donde lo importante es dar con una solución inmediata lo preciso es hacer un pequeño cambio y ya…  Evito abrir el archivo. Sencillamente quiero cambiar algo dentro de un archivo de configuración y reiniciar el servicio.

Seguir leyendo» Sin comentarios

History con fecha y hora

Categoría(s): Debian, FreeBSD, GNU/Linux, Línea de comandos, Mac OS X, UNIX

screenshot-willtaichi

Cuando trabajamos en la línea de comandos de UNIX o Linux,  regularmente, revisamos cuales comandos se han ejecutado de esta manera;

user@computer:$ history

Ah..! -pero si quiero saber exactamente la  hora y fecha de ejecución, entonces lo que necesito es activar esta variable de entorno con algunos parámetros;

user@computer:$ export HISTTIMEFORMAT='%F %T '

Seguir leyendo» Sin comentarios