Perl
用 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
用這個 :
$ echo 'ABCæøåDEF' | perl -CSD -Mutf8 -pe 's/([æøå])/[$1]/g'
也適用於文件
輸出 :
ABC[æ][ø][å]DEF
筆記 :
您的輸入:
$ 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 程式碼,並使用轉義符,比如
\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/;
進一步閱讀:neednitut、neednifaq、needniintro、neednicode、neednicook。