Aclarar grep y regex

Aclarar grep y regex

Conjunto de palabras que tienen 10 caracteres y que contienen una subcadena de tres vocales consecutivas. Hasta ahora probé estos comandos.

grep -E '^.{10}$'| grep 'a*.e*.i*.o*.u*' words2.txt
grep -E '^.{10}$&a*.e*.i*.o*.u*' words2.txt

Datos de entrada, extraídos mediante OCR deesta captura de pantalla:

unpernicious
unperspicuous
unpervious
unpious
unpiteous
unpiteously
unpiteousness
unplebeian
unplenteous
unportmanteaued
unportuous
unprecarious
unprecious
unprecocious
unpredacious
unpresumptuous
unpresumptuously
unpretentious
unpretentiously
unpretentiousness
unpromiscuous
unpropitious
unpropitiously
unpropitiousness
unpugnacious
unpunctilious
unquailed
unquailing
unquailingly
unqueen
unqueened
unqueening
unqueenlike
unqueenly
unquiescence
unquiescent
unquiescently
unquiet
unquietable
unquieted
unquieting
unquietly
unquietness
unquietude
unrapacious
unrebellious
unreligious
unreligiously
unreligiousness
unrighteous
unrighteously
unrighteousness
unsacrilegious
Unsagacious
unsalubrious
unsanctimonious
unsanctimoniously
unsanctimoniousness
unsanguineous
unsanguineously
unseditious
unseeable
unseeing

Respuesta1

Su problema (en mi humilde opinión) se resuelve mejor con awk, pero solo señalaré un problema con su comando

grep -E '^.{10}$'| grep 'a*.e*.i*.o*.u*' words2.txt 

Para filtrar el contenido del archivo word2.txta través de ambas grepinvocaciones, esto debería verse así

grep -E '^.{10}$' words2.txt | grep 'a*.e*.i*.o*.u*'

El segundo greppatrón debería ser [auoie]{3}, lo que nos lleva a

grep -E '^.{10}$' words2.txt | grep -E '[aouie]{3}'

La entrada al primero grepes su archivo. La entrada del segundo grepes la salida del primero grep,notu archivo.

Usando un POSIX awk(como versiones recientes de GNU awk):

$ awk 'length == 10 && /[aouei]{3}/' words2.txt
unpervious
unplebeian
unportuous
unprecious
unquailing
unqueening
unquieting
unquietude

mawk, BSD awky las implementaciones históricas anteriores a POSIX de awkno admiten {n}expresiones regulares comoseñalado por Stéphane Chazelas.

Respuesta2

Tenías bien los 10 caracteres, pero para encontrar 3 vocales seguidas busca un grupo [AEIOU]:

egrep '^.{10}$' | egrep -i '[AEIOU]{3}'

Para rechazar el espacio en blanco use esto:

egrep '^[^ \t]{10}$' | egrep -i '[AEIOu]{3}'

Respuesta3

Suponiendo 1 palabra/línea, puedes hacer esto:

sed -nE '/^.{10}$/!d;/[aAeEiIoOuU]{3}/p' words.txt

Respuesta4

Con grepsoporte PCRE integrado:

grep -iPx '(?=.*[aeiou]{3}.*).{10}'

O:

grep -wiP '(?=\w*[aeiou]{3}\w*)\w{10}'

para buscar esas palabras cuando no sean una por línea (agregue -osi su grepimplementación lo admite para imprimir solo las palabras coincidentes en lugar de toda la línea en la que se encuentran). Allápalabrasignifica cualquier secuencia depalabracaracteres (letras (en la escritura latina, sin signos diacríticos solamente, agregue una (*UCP)para las letras en cualquier escritura, aunque eso aún no cubrirá vocales como éo α), dígitos y guiones bajos).

información relacionada