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
답변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
$ 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
이것은 약간 창의적입니다. @ARGV
UTF-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'