如何perl
从 shell 中正确替换 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 替换 Unicode 字符会立即生效:
$ 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,则始终可以用纯 ASCII 编写 Perl 代码,并在较新的 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'