Substituir caracteres UTF-8 por shell perl

6

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
    
por forthrin 02.04.2018 / 14:27

3 respostas

8

Use isto:

 $ echo 'ABCæøåDEF' |
    perl -CSD -Mutf8 -pe 's/([æøå])/[$1]/g'

Funciona também para arquivos

Saída:

ABC[æ][ø][å]DEF

Nota:

  • substituições: \1 é para , is para e em usamos $1
  • verifique perldoc perlrun para -CSD utf8 truques
por 02.04.2018 / 14:54
1

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 .

    
por 02.04.2018 / 20:21
-2

$ echo 'ABCæøåDEF' |     perl -CS -Mutf8 -pe 's / ([æøå]) / [$ 1] / g'

    
por 02.04.2018 / 20:26

Tags