Esclareça grep e regex

Esclareça grep e regex

conjunto de palavras com 10 caracteres e que contêm uma substring de três vogais consecutivas. Até agora eu tentei esses comandos.

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

Dados de entrada, extraídos via OCR deesta captura de tela:

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

Responder1

Seu problema é (IMHO) melhor resolvido com awk, mas vou apenas apontar um problema com seu comando

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

Para filtrar o conteúdo do arquivo word2.txtatravés de ambas grepas invocações, isso deve ser parecido com

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

O segundo greppadrão deveria ser [auoie]{3}, o que nos leva a

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

A entrada para o primeiro grepé o seu arquivo. A entrada para o segundo grepé a saída do primeiro grep,nãoseu arquivo.

Usando um POSIX awk(como versões recentes do GNU awk):

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

mawk, BSD awke implementações históricas pré-POSIX awknão suportam {n}expressões regulares comoapontado por Stéphane Chazelas.

Responder2

Você acertou os 10 caracteres, mas para encontrar 3 vogais seguidas, procure um grupo [AEIOU]:

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

Para rejeitar o espaço em branco, use isto:

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

Responder3

Supondo 1 palavra/linha, você pode fazer isso:

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

Responder4

Com grepsuporte PCRE:

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

Ou:

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

para procurar essas palavras quando elas não são uma por linha (adicione -ose sua grepimplementação suportar a impressão apenas das palavras correspondentes, em vez da linha inteira em que foram encontradas). Lápalavrasignifica qualquer sequência depalavracaracteres (letras (na escrita latina, sem apenas diacríticos, adicione um (*UCP)for letras em qualquer escrita, embora isso ainda não cubra vogais como éou α), dígitos e sublinhado).

informação relacionada