fold
バイトではなく文字を認識するように設定できますか?繁体字中国語はそれぞれ3バイト(最小UTF-8)でエンコードされているようです。つまり、fold
sが-w
3の倍数でない場合、次のようなことが発生します。
$ cat in.txt
【財經中心、政治中心╱台北報導】看不慣政府施政效率緩慢,鴻海集團董事長郭台銘動念選總統!《壹週刊》報導,在川普勝選當晚,郭召集鴻海高層幹部,進行美國總統大選換人後的應變策略演練,讓人驚訝的是,郭詢問在場幹
$ cat in.txt | fold # -w is 80 by default
【財經中心、政治中心╱台北報導】看不慣政府施政效率緩��
�,鴻海集團董事長郭台銘動念選總統!《壹週刊》報導,在�
��普勝選當晚,郭召集鴻海高層幹部,進行美國總統大選換人
後的應變策略演練,讓人驚訝的是,郭詢問在場幹
fold
デフォルトの出力幅は80列なので、26 * 3 + 2
1行に26 2/3文字(または80バイト)が印刷されます。したがって、-w
文字の破損を防ぐために3の倍数に設定する必要があります。それでは、少なくともfold
、columns=bytes
.についてはもう一度申し上げますが、fold
マルチバイト文字をサポートするように設定できますか?マニュアルページにはこれについて何も言及されていません。
ベストアンサー1
GNU FoldとGNU fmtは文字ではなくバイトだけを理解します。特定の文字数に改行するには、sedを使用できます。
sed 's/.\{20\}/&\n/g' <in.txt
【財經中心、政治中心╱台北報導】看不慣政
府施政效率緩慢,鴻海集團董事長郭台銘動念
選總統!《壹週刊》報導,在川普勝選當晚,
郭召集鴻海高層幹部,進行美國總統大選換人
後的應變策略演練,讓人驚訝的是,郭詢問在
場幹
スペースを取り除きたい場合(さまざまな言語に役立つ)、ここにすばやく汚れたawkスクリプトがあります。
awk '
BEGIN {width = 20}
NF == 0 {column = 0; print}
{
split($0, a);
for (i in a) {
w = length(a[i]) + 1;
column += w;
if (column > width) {column = w; print ""};
if (column != w) printf " ";
printf "%s", a[i];
}
}
END {if (column) print ""}'
とにかく、あなたのロケール設定が正しいです。特に、LC_CTYPE
正しい文字エンコーディングを指定する必要があります。たとえば、UnicodeをUTF-8でエンコードしLC_CTYPE=en_US.utf8
たりLC_CTYPE=zh_CN.utf8
(システムで利用可能なすべての言語コードが機能する)
画面幅ではない文字数を計算します。固定幅フォントにも二重幅文字がある可能性があります。これは通常、中国語の文字の場合です。たとえば、上記の文字幅が20のテキストは、一般的な端末で40列を占めます。