Clarify grep & regex

1

conjunto de palavras com 10 caracteres e que contêm uma subseqüência 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

Insira dados extraídos por meio do OCR de esta 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
    
por Mariyam Mohammed Jalil 26.04.2017 / 07:42

4 respostas

2

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.txt por meio de ambas as invocações de grep , isso deve se parecer com

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

O segundo padrão grep deve ser [auoie]{3} , o que nos leva a

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

A entrada para o primeiro grep é seu arquivo. A entrada para o segundo grep é a saída do primeiro grep , não do seu 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 awk e implementações pré-POSIX históricas de awk não suportam {n} em expressões regulares como apontado por Stéphane Chazelas .

    
por 26.04.2017 / 11:16
2

Você tinha os 10 caracteres certos, 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}'
    
por 26.04.2017 / 07:50
2

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

sed -nE '/^.{10}$/!d;/[aAeEiIoOuU]{3}/p' words.txt
    
por 26.04.2017 / 08:44
1

Com grep construído com suporte a PCRE:

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

Ou:

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

para pesquisar essas palavras quando elas não forem uma por linha (adicione -o se sua grep implementation oferecer suporte para imprimir as palavras correspondentes apenas em vez da linha inteira na qual elas são encontradas). Há palavra significa qualquer seqüência de caracteres palavra (letras (no script latino, sem diacríticos apenas, adicione um (*UCP) para letras em qualquer script, embora isso ainda vença) t cobrir as vogais como é ou α ), dígitos e sublinhados.

    
por 26.04.2017 / 13:55