用 shell perl 替换 UTF-8 字符

用 shell perl 替换 UTF-8 字符

如何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

用这个 :

 $ 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,则始终可以用纯 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'

相关内容