Ejemplo de regex de vim: Obtención de títulos de imágenes

Como parte de una tarea me pidieron enlistar todos los miembros del Khronos Group en las diferentes áreas. Al entrar a la página vi que no había una lista definida de nombres, más bien el grupo de logos y luego una pequeña descripción de cada miembro.

Por ejemplo, la página de “contributors” es la siguiente: http://www.khronos.org/members/contributors/

Para bien o para mal, da flojera copiar los nombres a mano, más sabiendo que el asunto se puede automatizar. En este caso noté que en los “title” de los logos venía el nombre de la compañía. Viendo el código fuente, a partir de la línea 374 hay etiquetas como esta:

<div class=”member_logo”><a href=”#3d_inc1″ title=”3D Inc.” class=”scroll_to”><img src=”/assets/uploads/sized/assets/uploads/member_logos/3D_logo_Mark_shadow-155×163.png” width=”155″ height=”162″ alt=”speaker” /></a></div>

Así para los 92 contribuidores (contados con wc -l contributors donde contributors fue el archivo donde guardé la lista depurada… pero me estoy adelantando)

El problema entonces es quitar todo el código y dejar simplemente el contenido del campo “title”. Es un buen uso de las regex de vim (o de lo que sea, pero en vim viene cómodo).

Para este caso usé lo siguiente

:%s:^.\+title=”\(.\+\)” class.\+$:\1:g

Donde:

  • :%s: indica que se hará un search y replace (s) en todo el documento (%)
  • ^ Busca el inicio de la línea
  • .\+ Busca uno o más (\+) caracteres del que sea menos newline (.)
  • title=” Busca exactamente esa cadena de caracteres
  • \( Agrupa los caracteres entre ese símbolo y el \), que vendrían siendo el contenido entre las comillas y por tanto el nombre de la compañía
  • .\+ Busca uno o más (\+) caracteres del que sea menos newline (.), es decir el nombre de la compañía
  • ” class Busca exactamente esa cadena de caracteres. Es necesario especificarla porque los comandos son “greedy” y \(.\+\)”.\+$ haría el match hasta las últimas comillas que encontrara, en vez de las primeras que son las de interés
  • .\+ Busca uno o más (\+) caracteres del que sea menos newline (.), es decir todo el código restante
  • $ Busca el final de la línea
  • :\1: El replace pattern, que en este caso solo es el contenido del primer (y único grupo), es decir el nombre de la compañía
  • g Aplica todas las veces que haga match en la línea (aquí no sería necesario)

Por último, como hay newlines entre los nombres, podemos quitarlas con

:g:^$:d

(Esto último apenas lo aprendí acá porque no sabía y me dio flojera borrar las líneas a mano, más sabiendo que también debería ser automatizable jejeje)

Y ya, el resultado lo guardé en un documento de texto (contributors que mencioné arriba) del cual luego se puede copiar el contenido a la tarea.

La página de la que he aprendido sobre los regex de vim:

http://www.softpanorama.org/Editors/Vimorama/vim_regular_expressions.shtml