Observe que o que constitui uma vogal varia de acordo com o idioma e a região.
Para as vogais inglesas comumente admitidas (aqui considerando apenas as versões em minúsculas):
vowels=aeiou
consonants=bcdfghjklmnpqrstvwxyz
grep "\([$vowels]\)[$consonants]"
Você pode adaptar $vowels e $consonants ao seu idioma.
No entanto, com o Unicode, pode ficar um pouco mais complicado.
Por exemplo, mesmo se restringirmos à escrita latina, em francês, isso corresponderia à palavra para o verão: été. No Unicode, no entanto, é pode ser escrito como um caractere único (U + 00E9 é ) ou em uma forma decomposta com e seguido por seu acento agudo combinando ( ◌́ U + 0301 ).
Além disso, há caracteres como fi que são outra maneira de escrever 2 caracteres fi .
Uma maneira de resolver isso é converter o texto em um formulário normalizado , onde eles são expandidos para o multi -aractere forma antes de verificar (e, em seguida, precisamos considerar caracteres base e sua seqüência de diacríticos ou outros caracteres combinados (o cluster graphem completo como e⃞ ! = é̂ ).
perl -MUnicode::Normalize -C -lne '
print if NFKD($_) =~ /((?=[aeiouy])\X)(?=[bcdfghjklmnpqrstvwxz])\X(?!\p{mark})/'
(NKFD é a forma de normalização com decomposição de compatibilidade , a que transforma é em e + ◌́ e fi em f + i ). / p>
\X in perl corresponde a um cluster graphem estendido . Então, (?=[aeiouy])\X é um cluster grafo cujo caractere base é uma vogal latina em minúscula (portanto, e ou é ...). Aqui, incluindo y como vogal (já que é considerado como tal em muitos idiomas usando o script latino).
Então, combinamos em um cluster de vogais seguido por um cluster consoante seguido pelo primeiro cluster como capturado em , mas precisamos garantir que o próximo caractere ainda não faça parte do cluster, caso contrário, ele corresponderia às coisas como eté . Daí o operador look-ahead negativo para verificar se o próximo caractere não é um com a propriedade mark .
Então, em uma entrada como:
fini
été
tacheté
Ele retorna:
fini
été