UTF-8 문자를 쉘 Perl로 대체

UTF-8 문자를 쉘 Perl로 대체

perl쉘에서 UTF-8 문자를 올바르게 바꾸는 방법은 무엇입니까 ?

예제에서는 표준 입력을 사용하지만 표준 입력도 작동하는 것이 필요합니다 perl ... file.

이것이 내가 기대하는 것입니다:

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

이것이 내가 얻는 것입니다:

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

유니코드 문자를 ASCII로 바꾸면 즉시 적용됩니다.

$ echo ABC123DEF | perl -CS -pe "s/([123])/[\\1]/g"
ABC[1][2][3]DEF

내 환경:

perl 5.18.2
Bash 3.2.57
LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8

답변1

이것을 사용하십시오 :

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

파일에서도 작동합니다.

산출:

ABC[æ][ø][å]DEF

노트:

  • 교체: \\1입니다, \1그리고우리는 사용$1
  • perldoc perlrunutf8 -CSD트릭 확인

답변2

귀하의 의견:

$ 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

IMO가 좋은 방법은-C옵션추가하다utf8:

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

명령줄에서 UTF-8을 사용하고 싶지 않다면 언제든지 Perl 코드를 순수 ASCII로 작성하고 최신 Perls에서 , \xAB또는 다음과 같은 이스케이프 문자를 사용할 수 있습니다.\x{ABCD}\N{U+ABCD}\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

이것은 약간 창의적입니다. @ARGVUTF-8로 해석되므로 소스 코드를 ASCII로 유지하고 명령줄 인수를 통해 UTF-8 문자를 전달할 수 있습니다(반드시 최선의 솔루션은 아니며 이를 활용하는 방법을 보여주기 위한 것임) -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

또는 언제든지 한 줄의 텍스트를 실제 스크립트로 바꿀 수 있습니다.

use warnings;
use 5.012;
use utf8;
use open qw/:std :encoding(UTF-8)/;
use charnames qw/:full :short/;

추가 자료:페루니투트,페루니팩,페루니 소개,페루니코드,페루니쿠크.

답변3

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

관련 정보