このコマンドに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は実際に何のためにあるのかヒントを見つけることができます。