Busque palabras que comiencen b
y terminen con o
y contengan i
o g
en 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 grep
y 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 soloi
og
.- Todos los demás caracteres (
b
yo
) de esta expresión regular en particular coinciden entre sí.
El uso de [[:alnum::]]*
en lugar de .*
evita hacer coincidir palabras que contienen espacios.
grep
se usa como
grep OPTIONS 'EXPRESSION' INPUT-FILES
y generará las líneas que coincidan EXPRESSION
con su salida estándar (el terminal, en este caso).
En este caso, querrá utilizar las opciones -w
y -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 grep
puede hacer. Voy a eliminar la -o
opció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 -w
opción y hacer
$ grep --color -E '\bb[[:alnum:]]*[ig][[:alnum:]]*o\b|$' palabras abucheo djhg biografíajdjjf dgdhdbgo ghhh
Tuvimos que agregar la -E
opción ya que |
es una expresión regular extendida. Coincidirá \b
en cualquier límite de palabra.
Respuesta2
Yo usaría grep
para hacer esto:
egrep -i "^b.*(i|g)+.*o$" /usr/share/dict/words
^b
empezar con "b".*
cualquier cosa en cualquier momento(i|g)*
"i" o "g" una o más veceso$
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 $w
y 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.