[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Buscar en el DRAE desde consola



Hola.

He encontrado este script que me parece muy interesante por lo útil. Sirve 
para buscar una palabra en el Diccionario de la Real Academia de la Lengua, y 
funciona perfecto. Yo lo he copiado a /usr/bin para poder ejecutarlo en 
cualquier consola, y te lo muestra de forma parecida a una página man. Espero 
que os sea tan útil como a mi:

#!/bin/sh

# ###########################################################################
#
# Autor: Miguel Angel Rodríguez (aka timeo)
# Email: asterion@terra.cl || miguelar@nahuelnovedades.cl
#
# Fecha: 09 de enero de 2004.
#
# Explicacion:
#  Script para buscar definiciones de términos
#  en el diccionario de la R.A.E "on line".
# 
# Utilidad:
# bRAE.sh busca definiciones de términos en la base de datos de la RAE,
# los muestra en pantalla y guarda una copia comprimida en un directorio
# creado por el programa para tal efecto. Además posee varias opciones
# de búsqueda y "limpieza" de archivos de definiciones. La idea base es
# tener un script para consultar en línea el diccionario de la Real 
#  Academia de la Lengua y a la vez ir almacenando el resultado de estas 
# consultas en nuestro disco duro.
#
# Dependencias:
# Lynx 2.8.X
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA.
#
#
# ###########################################################################

PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin
export PATH

if [ -z "$LANG" ]
then
 LANG="es_ES.ISO-8859-1" # No usamos LANG="C" porque el script es para 
trabajar
 export LANG  # exclusivamente con palabras del idioma español o
fi    # castellano.

trap "" 1

test -x /bin/cat || exit 0
test -x /bin/date || exit 0
test -x /bin/echo || exit 0
test -x /bin/grep || exit 0
test -x /bin/gzip || exit 0
test -x /bin/mkdir || exit 0
test -x /bin/mv || exit 0
test -x /bin/rm || exit 0
test -x /bin/sed || exit 0
test -x /bin/zgrep || exit 0
test -x /sbin/ifconfig || exit 0
test -x /usr/bin/clear || exit 0
test -x /usr/bin/cut || exit 0
test -x /usr/bin/file || exit 0
test -x /usr/bin/find || exit 0
test -x /usr/bin/less || exit 0
test -x /usr/bin/lessfile || exit 0
test -x /usr/bin/lynx || exit 0
test -x /usr/bin/stat || exit 0
test -x /usr/bin/touch || exit 0
test -x /usr/bin/wc || exit 0

# Nos aseguramos de que esté establecido
# el entorno para que less pueda abrir 
# ficheros comprimidos con gzip.

eval "$(lessfile)"

################################################
#
# Algunas constantes para hacernos la vida más
# cómoda.
#
################################################

# Definimos una constante para el nombre del
# programa. $0 no nos sirve, pues nos da el
# path absoluto. :-(
PROGRAMA="bRAE.sh"

# Definimos la interfaz de red que nos conecta 
# a internet.
DEVICE="ppp0"

# Nombre (URL) del servidor de la RAE.
SERVIDOR="buscon.rae.es"

# Dirección URL del servidor de la base de datos
# de la RAE.
URL="http://buscon.rae.es/draeI/SrvltGUIBusUsual?TIPO_HTML=2&LEMA=";

# Directorio en donde se guardan las archivos 
# de términos encontrados y comprimidos.
BD=${HOME}/DRAE/

# Fichero que se usa para escribir la lista de
# palabras que se desean buscar de una sola vez.
FICHEROPALABRAS=${HOME}/palabrasRAE.txt

# Fichero usado para guardar temporalmente la
# lista de palabras que todavía faltan buscar.
FICHEROPALABRASTMP=${HOME}/palabrasRAE-TMP.txt

# Cadena de texto que muestra el servidor de la RAE cuando
# la palabra buscada no se encontró.
CADENARAE='La palabra consultada no está en el Diccionario.'

# Caracteres especiales excluidos. ¿Falta alguno?
CARESPECIALES="[-ªº\!\|\"\@·\#\$\%\&\/\(\)\=\?¿\'¡Çç\{\}\*\+\_\;\:\.\<\>\`]"


################################################
#
# Funciones para escribir menos y ocupar menos
# espacio ;-).
#
################################################

function buscar_borrar_ficheros() {

# Para determinar cuáles ficheros no contienen definiciones
# medimos su extensión (100 b), constatamos la existencia
# -o no- de una cadena de texto especial y, por último,
# comprobamos el tipo de fichero (si es comprimido o no).
# Síntesis: comprobamos tamaño (stat), contenido (zgrep) y formato (file).

 nom_fichero=`echo $1 | cut -c 6- | cut -f2 -dE | cut -c 2- | cut -f1 -d.`

 if [[ `stat -c %s $1` -le 100 || -n `zgrep 'La palabra '\"$nom_fichero\"' \
no está en el Diccionario.' $1` || -z `file -b $1 | grep -s  'gzip compressed 
data'` ]]
 then
  case "$2" in
   "0")
   let numero=numero+1
   echo -e "\nBorrando ficheros vacíos... $1 [$numero]\n"
   rm -f $1
   ;;

   "1")
   let numero=numero+1
   echo -e "\nMostrando ficheros vacíos... $1 [$numero]\n"
   ;;
  esac
 fi
}

function comprobar_fichero() {

 if [[ -s $FICHEROPALABRAS ]]
 then
  palabras=`cat $FICHEROPALABRAS`
 else
  echo -e "\nNo existe fichero de palabras a buscar, o está vacío.\n"
  exit 0;
 fi
}

function comprobar_fichero_2() {

 if [[ ! -f $1 ]]
 then
  touch $1
 fi
}

function comprobar_directorio() {

 if [[ ! -d $BD ]]
 then
  mkdir $BD
 fi 
}

function comprobar_entradas() {

# Comprobamos si los caracteres introducidos son
# válidos. No aceptamos mayúsculas ni dígitos
# ni caracteres especiales. 

 case "$3" in
  "0")
  comando="cat"
  ;;

  "1")
  comando="echo"
  ;;
 esac

 if [[ `$comando $1 | grep [[:upper:]]` || `$comando $1 | grep [[:digit:]]` \
|| `$comando $1 | grep -e $2` || `$comando $1 | wc -m` -gt 30 ]]
 then
  echo -e "\nIntroduzca una cadena válida. Debe estar compuesta sólo\n\
de letras minúsculas y tener menos de 30 caracteres.\n"
  exit 0
 fi
}

function comprobar_conexion() {

# Usamos doble comprobación por si es el caso
# de una máquina parte de una LAN con IP MASQUERADE.

 if [[ -z `ifconfig $DEVICE 2> /dev/null | grep 'inet addr:' | cut -f2 -d: | 
cut -f1 -dP` ]]
 then
  if [[ -z `ping -c 1 $SERVIDOR | grep 'from' | cut -f2 -dm  | cut -f1 -d:` ]]
  then
   case "$1" in
    "0")
    echo -e "\nNo existe conexión a Internet.\n"
    exit 0
    ;;

    "1")
    conexion=0
    ;;
   esac
  fi
 fi
}

function buscar_definicion() {

# Buscamos la definición del término y el
# resultado de la búsqueda lo convertimos
# en texto plano comprimido.

 echo -e "\nBuscando definición de \"$1\"... $2"
 lynx -dump --nolist ${URL}${1} > ${BD}${1}

# Comprobamos si existe o no la definición
# en el servidor de la RAE.

 if [[ -n `grep -Es 'La palabra '\"$1\"' no está en el Diccionario.' 
${BD}${1}` ]] 
 then
  rm ${BD}${1}
  echo -e "\n$CADENARAE\n"
  case $3 in
   "0")
   exit 0
			;;

			"1")
#	!El poder de sed!... y el enorme consumo de ciclos de reloj para
#	hacer una "virguería" en un ficherito. :->
#	Este es un HACK, y de los peores.
			sed s/$1//g $FICHEROPALABRAS > $FICHEROPALABRASTMP
			sed '/^$/d' $FICHEROPALABRASTMP > $FICHEROPALABRAS
			rm $FICHEROPALABRASTMP
			let fallos=fallos+1
			continue
			;;
		esac
	fi

	gzip -9 ${BD}${1}
}

function mensaje_error() {

	echo -e "\nUse parámetro $1.\n"
	exit 1
}

################################################
#
# Comienza el programa... o las opciones.
#
################################################

cat << EOF

$PROGRAMA
EOF

if [[ ! $# -ge 1 ]]
then
 echo -e "\nIntroduzca un vocablo. O use el parámetro -m.\n"
 exit 0

################################################
#
# Buscamos la definición de una serie de
# palabras que se encuentran en un fichero 
# ($HOME/palabrasRAE.txt).
# Tenemos la opción de ver o no la definición de
# cada una de ellas mediante el parámetro [-t].
#
################################################ 

elif [[ $1 = "-a" ]]
then
# Averiguamos si estamos conectados a Internet.
 comprobar_conexion "0"

# Comprobamos la existencia del fichero de palabras
# y, si existe, pasamos su contenido a la variable
# $palabras.
 comprobar_fichero

# Probamos la validez de los caracteres introducidos.
 comprobar_entradas "$FICHEROPALABRAS" "$CARESPECIALES" "0"

# Buscamos las palabras, primero en nuestro disco duro.
# Si no se encuentran aquí, buscamos en el servidor de la RAE.

 let numero=0
 for termino in $palabras
 do
  if [[ -s ${BD}${termino}.gz ]]
  then
   case "$2" in
    "")
    echo -e "\nCaché...\n" 
    ;;

    "-t")
    less -sSC -~ ${BD}${termino}.gz
    ;;

    *)
    mensaje_error "-t"
    ;;
   esac
  else
   comprobar_directorio

   let numero=numero+1
   case "$2" in
    "")
    buscar_definicion "$termino" "$numero" "1"
    ;;

    "-t")
    buscar_definicion "$termino" "$numero" "1"
    less -sSC -~ ${BD}${termino}.gz
    ;;

    *)
    mensaje_error "-t"
    ;;
   esac
  fi
 done

 let cero=0
 resultado=${fallos:=$cero}
 encontradas=`expr $numero - $resultado` # Variable $fallos viene de función
 clear                                   # buscar_definición().
 echo -e "\n$numero palabras buscadas en el servidor.\n
 $encontradas definiciones halladas.\n
 $resultado no encontradas.\n"

################################################
#
# Borramos los archivos generados por búsquedas
# fallidas. 
#
# - Con el parámetro [-b] sin nada más, buscamos 
# y borramos todos los ficheros comprimidos
# (*.gz).
# - Con el parámetro opcional [-t] buscamos
# todos los ficheros vacíos, y los borramos. 
# - Con el parámetro opcional [-h] buscamos y
# borramos los ficheros comprimidos de hoy.
# - Con el parámetro opcional [-th] borramos 
# todos los ficheros (comprimidos o no) de hoy. 
#
# Las opciones [-b] y [-b -t] pueden llegar a
# ser extremadamente lentas.
#
################################################ 

elif [[ $1 = "-b" ]]
then
 echo -e "\nBuscando ficheros vacíos..."

 for ficheros in ${BD}*
 do
  case "$2" in
   "")
   if [[ `find $ficheros -daystart -name '*.gz' -print` ]]
   then
    buscar_borrar_ficheros "$ficheros" "0"
   fi
   ;;

   -t)
   buscar_borrar_ficheros "$ficheros" "0"
   ;;

   -h)
   if [[ `find $ficheros -daystart -name '*.gz' -ctime -1 -print` ]]
   then
    buscar_borrar_ficheros "$ficheros" "0"
   fi
   ;;

   -th)
   if [[ `find $ficheros -daystart -name '*' -ctime -1 -print` ]]
   then
    buscar_borrar_ficheros "$ficheros" "0"
   fi
   ;;

   *)
   mensaje_error "-t, -h, o -th"
   ;;
  esac
 done

 if [[ $numero -gt 0 ]]
 then
  clear
  echo -e "\n$numero entradas borradas."
  exit 0
 else
  echo -e "\nNo encontré ficheros para borrar. I'sorry... :-)\n"
  exit 0
 fi

################################################
#
# Buscamos los archivos generados por búsquedas
# fallidas. Igual que con el parámetro [-b] pero
# sin borrar nada.
#
# - Con el parámetro [-v] sin nada más, buscamos
# todos los ficheros comprimidos (*.gz).
# - Con el parámetro opcional [-t] buscamos la
# totalidad de los ficheros vacíos.
# - Con el parámetro opcional [-h] buscamos sólo
# los ficheros comprimidos (*.gz) de hoy.
# - Con el parámetro opcional [-th] buscamos la
# totalidad de los ficheros vacíos de hoy.
#
# Las opciones [-v] y [-v -t] pueden llegar a
# ser extremadamente lentas.
#
# Opción para curiosos 8-).
#
################################################ 

elif [[ $1 = "-v" ]]
then
 echo -e "\nBuscando ficheros vacíos..."

 for ficheros in ${BD}*
 do
  case "$2" in
   "")
   if [[ `find $ficheros -daystart -name '*.gz' -print` ]]
   then
    buscar_borrar_ficheros "$ficheros" "1"
   fi
   ;;

   -t)
   buscar_borrar_ficheros "$ficheros" "1"
   ;;

   -h)
   if [[ `find $ficheros -daystart -name '*.gz' -ctime -1 -print` ]]
   then
    buscar_borrar_ficheros "$ficheros" "1"
   fi
   ;;

   -th)
   if [[ `find $ficheros -daystart -name '*' -ctime -1 -print` ]]
   then
    buscar_borrar_ficheros "$ficheros" "1"
   fi
   ;;

   *)
   mensaje_error "-t, -h, o -th"
   ;;
  esac 
 done

 if [[ $numero -gt 0 ]]
 then
  clear
  echo -e "\nEncontré $numero ficheros vacíos. ¿Muchos?\n"
  exit 0
 else
  echo -e "\nNo encontré ficheros vacíos. I'sorry... :-)\n"
  exit 0
 fi

################################################
#
# Opción para mostrarnos el número total de
# entradas en el directorio del diccionario.
#
# - Con el parámetro [-n] sin nada más, nos
# muestra la totalidad de entradas comprimidas
# (*.gz).
# - Con el parámetro opcional [-t] nos muestra
# el número total de entradas.
# - Con el parámetro opcional [-h] nos muestra
# el número de ficheros comprimidos de hoy.
# - Con el parámetro opcional [-th] nos muestra
# el número total de ficheros de hoy.
#
# Otra opción para curiosos.
#
################################################ 

elif [[ $1 = "-n" ]]
then
 case "$2" in
  "")
  cantidad=`find $BD -mindepth 1 -name '*.gz' -print | wc -l`
  echo -e "\nHay $cantidad palabras en el diccionario.\n"
  ;;

  -t)
  cantidad_total=`find $BD -mindepth 1 -name '*' -print | wc -l`
  echo -e "\nHay $cantidad_total palabras en el diccionario (total).\n"
  ;;

  -h)
  fecha=`date +%d-%m-%y`
  cantidad_hoy=`find $BD -mindepth 1 -daystart -name '*.gz' -ctime -1 -print | 
wc -l`
  echo -e "\nHay $cantidad_hoy palabras en el diccionario (hoy: $fecha).\n"
  ;;

  -th)
  fecha=`date +%d-%m-%y`
  cantidad_total_hoy=`find $BD -mindepth 1 -daystart -name '*' -ctime -1 
-print | wc -l`
  echo -e "\nHay $cantidad_total_hoy palabras en el diccionario (total hoy: 
$fecha).\n"
  ;;

  *)
  mensaje_error "-t, -h, o -th"
  ;;
 esac

################################################
#
# Limpiamos el archivo $HOME/palabrasRAE.txt.
# Sólo dejamos las palabras cuya definición aún
# debemos hallar.
#
################################################ 

elif [[ $1 = "-l" ]]
then
# Pasamos el contenido del fichero a la
# variable $palabras

 comprobar_fichero
 comprobar_fichero_2 "$FICHEROPALABRASTMP"

 let numero=0

 for termino in $palabras
 do
  if [[ ! -s ${BD}${termino}.gz ]]
  then
   echo -e $termino >> $FICHEROPALABRASTMP
   let numero=numero+1
  fi
 done

 mv $FICHEROPALABRASTMP $FICHEROPALABRAS

 echo -e "\n$numero palabras guardadas.\n"

################################################
#
# Menú para no olvidarnos del uso para el cual
# fue hecho este script :-).
#
################################################ 

elif [[ $1 = "-m" ]]
then
 declare -a MENU

 MENU=(
  "Busca definiciones en el DRAE \"on line\"."
  "Versión: 0.01"
  "Autor: Miguel Angel Rodríguez"
  "Licencia: Este programa se distribuye bajo licencia"
  "--------- GNU GPL y SIN NINGUNA GARANTIA."
  ""
  "Modo de uso:" 
  "-----------  bRAE.sh [palabra] busca definición de [palabra]."
  ""
  "[-a] busca definiciones de palabras desde un fichero"
  "[-a] [-t] ídem anterior pero mostrando cada una de las definiciones."
  ""
  "[-b] busca y borra las entradas vacías con extensión <*.gz>."
  "[-b] [-t] busca y borra todas las entradas vacías."
  "[-b] [-h] busca y borra las entradas vacías con extensión <*.gz> de hoy."
  "[-b] [-th] busca y borra todas las entradas vacías de hoy."
  ""
  "[-v] busca los ficheros vacíos con extensión <*.gz>."
  "[-v] [-t] busca todos los ficheros vacíos."
  "[-v] [-h] busca los ficheros vacíos con extensión <*.gz> de hoy."
  "[-v] [-th] busca todos los ficheros vacíos de hoy."
  ""
  "[-n] muestra cantidad de ficheros con extensión <*.gz>."
  "[-n] [-t] muestra total de ficheros."
  "[-n] [-h] muestra la cantidad de ficheros con extensión <*.gz> de hoy."
  "[-n] [-th] muestra el total de ficheros de hoy."
  ""
  "[-l] limpia el fichero de palabras encontradas." 
  ""
  "[-m] este menú."
  ""
  "Comunicar bugs y modificaciones a <software@nahuelnovedades.cl>."
  ""
 )

 let numero=0
 while [ $numero -lt 33 ]
 do
  echo ${MENU[numero++]}
 done

################################################
#
# Buscamos la definición de una palabra mediante
# una consulta al servidor de la RAE.
#
################################################ 

else
 comprobar_entradas "$1" "$CARESPECIALES" "1"

# Comprobamos si estamos conectados a Internet.
# El resultado lo alojamos en la variable $conexion.
 comprobar_conexion "1"

 if [[ -s ${BD}${1}.gz ]]
 then
  echo -e "\nCaché...\n"
  less -sSC -~ ${BD}${1}.gz
 elif [[ $conexion = "0" ]]
 then
  echo -e "\nNo existe conexión a Internet.\n"
  comprobar_fichero_2 "$FICHEROPALABRAS"
  if [[ ! `grep -w $1 $FICHEROPALABRAS` ]]
  then
   echo -e "Palabra guardada para su posterior búsqueda.\n"
   echo "$1" >> $FICHEROPALABRAS 
  else
   echo -e "Esta palabra ya fue guardada para su posterior búsqueda.\n"
  fi
  exit 0
 else
  comprobar_directorio
  buscar_definicion "$1" "" "0"
  less -sSC -~ ${BD}${1}.gz
  clear
 fi
fi
# -=-= fin de bRAE.sh =-=-

# Para escribir este shellscript se usó
# VIM - Vi IMproved 6.2 (2003 Jun 1, compiled Nov  9 2003 21:20:15).


-- 
   Un saludo de Willy Walker ;o)
   Usuario Linux: 100651
   Debian Sid 2.6.5
   Uno pregunta, muchos responden, todos aprenden.



Reply to: