jueves, 27 de febrero de 2014

Definiciones de Wikipedia en la terminal

Hoy voy a compartir una función para Bash que he elaborado esta semana con el objeto de poder consultar cómodamente desde la línea de comandos definiciones de ciertos términos en Wikipedia (en inglés, más que nada por la calidad de la información sobre temas técnicos que suelo consultar). He optado por una función de la shell en lugar de un script del estilo de drae, diccionario RAE de línea de comandos recientemente publicado, debido a la corta extensión del código, basado principalmente en una tubería de comandos:

function wps {
    if [ $# -eq 0 ]; then
        return
    else
        params=$*
        q=${params// /_}
    fi
    wget -qO - http://en.wikipedia.org/wiki/$q |\
    sed '/<table class="infobox/,/<\/table>/d' |\
    grep -m1 '<p>.*</p>' |\
    sed -e 's/<p>/\n/' -e 's/<\/p>/\n/' \
        -e 's/<[^>]*>//g' -e 's/\[[^]]*\]//g' |\
    sed -e 's/[0-9A-Za-z, ]*may refer to[:a-z ]*/ Ambiguous term/' \
        -e 's/[0-9A-Za-z, ]*can mean[:a-z ]*/ Ambiguous term/'
}

Paso a analizar los "ingredientes" usados:
  • La estructura condicional es para finalizar si no hay argumentos de línea de comandos y si los hay formatearlos para la posterior consulta en Wikipedia usando la sintáxis adecuada en el URL.
  • Se ejecuta wget para recuperar de forma silenciosa el documento web correspondiente al URL recién construido. El contenido HTML del mismo es el que se pasa por la tubería a los siguientes comandos, que hacen de filtros.
  • El primer sed elimina la tabla informativa que hay en ciertos artículos y que suele estar al principio del contenido; no nos interesa la información que resume y además estorba para recuperar el primer párrafo.
  • El comando grep lo usamos para seleccionar el contenido del primer párrafo "normal" en el contenido del artículo; es el resumen que queremos extraer.
  • El segundo sed incluye varias reglas de edición encaminadas a sustituir las etiquetas de párrafo por saltos de línea (para formatear la salida por pantalla) y a continuación eliminar el resto de etiquetas HTML y de anotaciones o referencias entre corchetes.
  • El último sed se encarga de detectar los casos en que el término es ambiguo (existen diversas acepciones con sus artículos correspondientes) para mostrar un mensaje de error genérico más adecuado. En este caso el usuario debería concretar más: por ejemplo, en lugar de ejecutar wps bash, ejecutar wps bash shell.
En fin, se trata de una muestra más de la potencia de la shell Bash a la hora de combinar comandos y utilidades preinstaladas en cualquier sistema Linux para crear nuevos comandos que proporcionen información útil en un segundo, aunque esta se encuentre alojada en un servidor al otro lado del mundo...