O GNU e o BSD sed
são compatíveis com vários bytes em códigos de idioma apropriados e o y
comando é análogo a tr
:
$ echo hello | sed -e 'y/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'
hello
Isso deve funcionar na maioria dos lugares em que você pode executá-lo, desde que sua localidade seja UTF-8.
O problema do Perl não é tão simples quanto tratar caracteres multibyte como bytes. Ele está entendendo bem sua entrada, e até mesmo codificando a saída, é o código-fonte que não entende:
$ echo abc | perl -C -pe 'tr/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'|hexdump -C
00000000 c3 af c2 bd c2 81 0a |.......|
A codificação UTF-8 de "a" é ef bd 81
, então você pode ver que ela está tratando "b" como o segundo byte e depois mutilando-o tentando codificá-lo na saída, e o mesmo para "c ". Você precisa use utf8
para ter sua própria fonte Perl (5) codificada dessa maneira ; -C
controla apenas o IO que o programa faz quando está em execução.
Você pode colocar use utf8;
na sua string -e
ou usar -Mutf8
na linha de comando :
$ echo abc | perl -C -Mutf8 -pe 'tr/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'
abc
O Perl 6 resolve esta questão, como muitos, mas ...