Com perl
, você pode fazer:
$ echo 'fooÉébAar' | perl -Mopen=locale -pe 's/([[:upper:]])(??{lc$^N})/<$&>/g'
foo<Éé>b<Aa>r
Isso usa o operador perl especial (??{code})
, no qual você pode especificar dinamicamente o regexp para corresponder. Aqui lc$^N
é a versão em minúscula de $^N
, o último grupo de captura.
Com o GNU sed
, você poderia fazer:
$ echo 'fooÉébAar' | sed -Ee 's/./&\L&/g;s/([[:upper:]](.).)/<<>>/g;s/(.).//g'
foo<Éé>b<Aa>r
A ideia é que primeiro acrescentemos cada caractere na entrada com a versão em minúscula ( X
se torna Xx
, x
se torna xx
), portanto, se vermos Xxx
depois disso ( ([[:upper:]](.)
: X
seguiu um caractere repetido), isso significa que temos um caractere maiúsculo seguido por sua versão em minúscula.
Observe que isso não funcionaria para caracteres em forma decomposta. Por exemplo, para É
quando expresso como E
seguido por um combinação de acento agudo . Para contornar isso, você pode usar o operador% regexp de cluster perl
\X
graphem:
$ printf 'E\u0301\u0302\u00e9\u0302 \u00c9e\u301 foo Ee\u301\n' |
perl -Mopen=locale -MUnicode::Normalize -pe '
s/((?=[[:upper:]])\X)(?{$c1 = $^N})(\X)(??{
NFD(lc$c1) eq NFD($^N) ? qr{} : qr{(?!)}})/<$&>/g'
<É̂é̂> <Éé> foo Eé
Acima de usar formulários de normalização canônica ( NFD
) para que os clusters de grafos sejam sempre representados da mesma maneira no nível dos caracteres.
Ele ainda não seria compatível com coisas como Fffi
, em que ffi
(U + FB03) é um caractere único (ligadura tipográfica), mas provavelmente é o mesmo, de qualquer maneira.