私はしばらく中国語のUnicodeテキストを扱ってきました。もちろん、一般的なルールが適用されます。grep
単語だけでなく、文字で作業することもできます。これは私にとって非常に便利です。
ところで、私がまだ把握していないことが一つあります。これが可能かどうかわかりません。
中国、日本、韓国がどのような分裂も受け入れないことは当然です。しかし、もちろんsplit -l
。
しかし、私が望むのは、split
必要な数の文字を使用できることです。
中国語のUnicodeの私の理解は、各文字の形のサイズが同じバイト数であるということです。したがって、使用できる最小公倍数である魔法のバイト数が必要です。split -b
そうですか?
私はその数に達するために試行錯誤しようとしましたが、失敗しました。代わりに、文字自体が分割され、CJKファイルが2つに分割されます。
たとえば、「Dongting Lake」という文字列のみを含む「dunting」というファイルを使用すると、split
本質的に意味のないコンテンツが生成されます。キャラクターの1つがsplit
溭に変わったこともあります...
答え1
xxd
次の出力に示すように、各文字の幅は3バイトです。
$ xxd chinese-bytes
0000000: e6b4 9ee5 baad e6b9 96 .........
split -b3
私のために動作します。
$ split -b3 chinese-bytes
$ echo xa?
xaa xab xac
$ cat xaa; echo
洞
$ cat xab; echo
庭
$ cat xac; echo
湖
答え2
私が知る限り、すべての漢字はエンコードの長さが3バイトです。UTF-8、Unixの一般的なUnicodeエンコーディングです。ただし、中国語以外の文字(スペースや改行文字など)は幅が異なる場合があります(デフォルトの制御文字やアラビア数字の形式などはすべて1バイト幅です)。ユーティリティsplit
は固定バイト数だけを理解しているため、整列されていないカットを無差別にします。
42文字ごとに分割するには、より洗練されたツールを使用する必要があります。以下は、トリックを実行するPerlフラグメントです(テストされていません)。すべての文字を同じように扱います。漢字は改行文字と同様に1と計算されます。
perl -CDS -e '
$n = 0;
while (read STDIN, $buf, 42) {
open OUT, sprintf("> output-$n.txt") or die;
print OUT $buf;
close OUT or die;
++$n;
}'
答え3
私が使用しているMac端末でegrep -o '.'