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: