このコマンドにcut
は、オプションの-c
あるバイトではなく、文字を処理するオプションがあります-b
。しかし、en_US.UTF-8
ロケールでは機能しないようです:
2番目のバイトは、2番目のASCII文字(UTF-8とまったく同じようにエンコードされます)を提供します。
$ printf 'ABC' | cut -b 2
B
ただし、UTF-8ロケールでは3つのギリシャ語の非ASCII文字のうち2番目の文字は表示されません。
$ printf 'αβγ' | cut -b 2
�
大丈夫-2番目のバイトです。
したがって、代わりに2番目の文字を見てみましょう。
$ printf 'αβγ' | cut -c 2
�
それは壊れているように見えます。
いくつかの実験で、範囲3-4
が2番目の文字を示していることがわかりました。
$ printf 'αβγ' | cut -c 3-4
β
しかし、これはバイト3〜4と同じです。
$ printf 'αβγ' | cut -b 3-4
β
したがって、これはUTF-8の-c
場合を超えません-b
。
ロケールのセットアップはUTF-8には適切ではないと思いますが、比較すると、wc
期待どおりに機能します。
多くの場合、オプション-c
(--bytes
)でバイトをカウントするために使用されます。
(紛らわしいオプション名に注意してください。)
$ printf 'αβγ' | wc -c
6
ただし、オプション-m
(--chars
)で文字をカウントすることもできます。
$ printf 'αβγ' | wc -m
3
だから私の構成は大丈夫だと思われる-しかし、何か特別なものですcut
。
たぶん、UTF-8をまったくサポートしていないのでしょうか?ただし、マルチバイト文字をサポートしているようです。そうでない場合、-b
およびをサポートする必要はありません-c
。
それで、何が問題なのですか?なぜ?
私が知る限り、ロケールのセットアップはutf8に適しています。
$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
バイトごとの入力:
$ printf 'αβγ' | hd
00000000 ce b1 ce b2 ce b3 |......|
00000006
-c
同じコードを使用しているようです-b
。ソースコードを見ましたか?たぶん、あなた-c
は実際に何のためにあるのかヒントを見つけることができます。