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é