Perl

用 shell perl 替換 UTF-8 字元

  • April 5, 2018

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

用這個 :

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

也適用於文件

輸出 :

ABC[æ][ø][å]DEF

筆記 :

  • 替換:\\1用於awk\1用於sed,在perl中我們使用$1
  • 檢查perldoc perlrunutf8-CSD技巧

您的輸入:

$ 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 程式碼,並使用轉義符,比如\xAB, \x{ABCD},或者在更新的 Perls\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

或者,當然,您可以隨時將 oneliner 變成實際腳本,您可以在其中

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

進一步閱讀:neednitutneednifaqneedniintroneednicodeneednicook

引用自:https://unix.stackexchange.com/questions/435043