Encontrar palabras con características particulares en un archivo de diccionario

Encontrar palabras con características particulares en un archivo de diccionario

Busque palabras que comiencen by terminen con oy contengan io gen un archivo de texto.

Se debe escribir un comando en la terminal que muestre una palabra que tenga las especificaciones descritas anteriormente.

He usado lo siguiente, pero no se detiene en una palabra y contiene espacios en blanco:

~$  egrep -n '\bb.*(i|g).*o\b'

Estoy usando Linux Ubuntu y no estoy seguro de cómo hacer la declaración. Probé varias instrucciones y todas fallaron. ¿Alguien puede ayudarme a desentrañar la declaración de expresiones regulares, ya que tengo dificultades para hacerlo?

Un ejemplo: digamos que tengo las siguientes palabras aleatorias en un archivo de texto:

boo djhg
bio jdjjf
dgdhd bgo
ghhh

Luego es necesario resaltar las palabras 'boo', 'bio' y 'bgo'.

Respuesta1

El comando que estás buscando es grepy la expresión regular que deseas es b[[:alnum:]]*[ig][[:alnum:]]*o.

  • [[:alnum:]]coincidirá con un solo carácter alfanumérico.
  • *coincidirá con cualquier número (incluido el cero) de la expresión anterior.
  • [ig]coincidirá con un solo io g.
  • Todos los demás caracteres ( by o) de esta expresión regular en particular coinciden entre sí.

El uso de [[:alnum::]]*en lugar de .*evita hacer coincidir palabras que contienen espacios.

grepse usa como

grep OPTIONS 'EXPRESSION' INPUT-FILES

y generará las líneas que coincidan EXPRESSIONcon su salida estándar (el terminal, en este caso).

En este caso, querrá utilizar las opciones -wy -o, que obligan a la expresión a coincidir con palabras (cadenas de caracteres rodeadas por caracteres que no son palabras) y devolver solo los datos coincidentes (no toda la línea).

$ grep -w -o 'b[[:alnum:]]*[ig][[:alnum:]]*o' words
bio
bgo

Mencionaste que queríasdestacarlas palabras coincidentes. Esto es algo que GNU greppuede hacer. Voy a eliminar la -oopción aquí para obtener la línea completa de cada coincidencia; de lo contrario, obtendrás el mismo resultado que antes, pero resaltado, lo cual sería aburrido.

$ grep --color -w 'b[[:alnum:]]*[ig][[:alnum:]]*o' palabras
biografíajdjjf
dgdhdbgo

Como puede ver, esto solo muestra las coincidencias en las líneas que contienen coincidencias. Para ver la entrada completa (líneas pares sin coincidencias), con las coincidencias resaltadas, tenemos que soltar la -wopción y hacer

$ grep --color -E '\bb[[:alnum:]]*[ig][[:alnum:]]*o\b|$' palabras
abucheo djhg
biografíajdjjf
dgdhdbgo
ghhh

Tuvimos que agregar la -Eopción ya que |es una expresión regular extendida. Coincidirá \ben cualquier límite de palabra.

Respuesta2

Yo usaría greppara hacer esto:

egrep -i "^b.*(i|g)+.*o$" /usr/share/dict/words
  • ^bempezar con "b"
  • .*cualquier cosa en cualquier momento
  • (i|g)*"i" o "g" una o más veces
  • o$terminar con "o"

Respuesta3

set -f; for w in `cat /usr/share/dict/words`; do
   case $w in b*[ig]*o ) echo "$w" ;; esac
done
# you could as well say: $(< /usr/share/dict/words) in place of the backquoted cat.
# if your version of bash supports it.

Estamos dividiendo el archivo de palabras en palabras $wy luego lo verificamos con comodines.

  • El patrón comodín es: b*[ig]*o, que debe leerse como:
  • $w debe comenzar con la letra "b".
  • $w debe terminar con la letra "o".
  • $w debe contener una "i" o una "g" en algún punto intermedio para que coincida
  • Tras una coincidencia exitosa, mostramos la palabra.

información relacionada