Use isto:
$ echo 'ABCæøåDEF' |
perl -CSD -Mutf8 -pe 's/([æøå])/[$1]/g'
Funciona também para arquivos
Saída:
ABC[æ][ø][å]DEF
Como obtenho o perl
para substituir corretamente o caractere UTF-8 de um shell?
Os exemplos usam stdin, mas eu preciso de algo que funcione para perl ... file
também.
Isso é o que eu espero:
$ echo ABCæøåDEF | perl -CS -pe "s/([æøå])/[\1]/g"
ABC[æ][ø][å]DEF
Isso é o que eu recebo:
$ echo ABCæøåDEF | perl -CS -pe "s/([æøå])/[\1]/g"
ABCæøåDEF
A substituição dos caracteres Unicode por ASCII funciona instantaneamente:
$ echo ABC123DEF | perl -CS -pe "s/([123])/[\1]/g"
ABC[1][2][3]DEF
Meu ambiente:
perl 5.18.2
Bash 3.2.57
LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8
Sua entrada:
$ cat input.txt
ABCæøåDEF
$ hexdump -C input.txt
00000000 41 42 43 c3 a6 c3 b8 c3 a5 44 45 46 0a |ABC......DEF.|
0000000d
Uma boa maneira de o IMO ser a -C
opção mais utf8
:
$ perl -CSD -Mutf8 -pe 's/([æøå])/[$1]/g' input.txt
ABC[æ][ø][å]DEF
$ cat input.txt | perl -CSD -Mutf8 -pe 's/([æøå])/[$1]/g'
ABC[æ][ø][å]DEF
Se você não quiser usar o UTF-8 na linha de comando, você sempre pode escrever seu código Perl em ASCII simples e usar fugas como \xAB
, \x{ABCD}
ou em Perls \N{U+ABCD}
ou \N{CHARNAME}
:
$ perl -CSD -pe 's/([\xE6\xF8\xE5])/[$1]/g' input.txt
ABC[æ][ø][å]DEF
$ cat input.txt | perl -CSD -pe 's/([\xE6\xF8\xE5])/[$1]/g'
ABC[æ][ø][å]DEF
Este está ficando um pouco criativo: @ARGV
será interpretado como UTF-8, então você pode manter seu código-fonte como ASCII e passar os caracteres UTF-8 através de um argumento de linha de comando (não necessariamente a melhor solução, apenas mostrando como você poderia fazer uso da opção -CA
):
$ perl -CSDA -pe 'BEGIN{$p=shift;} s/($p)/[$1]/g' '[æøå]' input.txt
ABC[æ][ø][å]DEF
$ cat input.txt | perl -CSDA -pe 'BEGIN{$p=shift;} s/($p)/[$1]/g' '[æøå]'
ABC[æ][ø][å]DEF
Ou, claro, você sempre pode transformar o delineador em um roteiro real, onde você pode
use warnings;
use 5.012;
use utf8;
use open qw/:std :encoding(UTF-8)/;
use charnames qw/:full :short/;
Outras leituras: perlunitut , perlunicode , perlunicook .
$ echo 'ABCæøåDEF' | perl -CS -Mutf8 -pe 's / ([æøå]) / [$ 1] / g'