Unixのコマンドカット範囲

Unixのコマンドカット範囲

次のように文字列を切り捨てるために 'cut' unixコマンドを使用するシェルスクリプトを作成しようとしています。

namecmpaux=$(echo $namecmp |cut -c0-19)

ただし、シェルを実行すると、次のエラーが発生します。

cut: fields and positions are numbered from 1 
Try `cut - help 'for more information.

以前は 'cut' コマンドを使って下限位置に 0 を使った記憶がありました。なぜ?オペレーティングシステムによって異なりますか?以前はSunOSを使用していましたが、Ubuntu 12.04を使用していました。

答え1

いいえ、すべての実装で同じですcut。数字は1から始まります。 0を提供して1として扱っても、Solarisは文句を言いません。0そしてそこはすべて1最初の文字を表し、2そこは2番目の文字を表します。

$ echo test | cut -c 0-2
te
$ echo test | cut -c 1-2
te

busybox cutまたは、cut組み込みの機能について文句を言わないでくださいksh93。 GNUは、cutおそらくあなたが最初のインデックスについて正しい考えを持っていないかもしれないことを知らせることによってあなたを助けようとします。

ただし、実際の違いは、GNUとbusybox cut(少なくとも2014年3月27日現在)はバイト単位で計算され、-cSolarisまたはkshはcutPOSIXが要求するように文字単位で計算されることです。

$ echo 'Stéphane' | cut -c 1-4
Sté
$ echo 'Stéphane' | busybox cut -c 1-4
Sté
$ echo 'Stéphane' | ksh -c 'command /opt/ast/bin/cut -c 1-4'
Stép

(UTF-8ロケールでは、é(U + 00E9)は2バイトを使用します。)

答え2

はい、おそらくOS(またはバージョンを作成した人cut)によって異なります。

を見ると、GNUのバイト数、文字数、フィールド数が1から始まるman cutのがわかります。cutcoreutils

-b、-c、または-fのいずれかを使用してください。 [...] 各範囲は次のいずれかです。
      窒素      窒素'1 から計算される最初のバイト、文字またはフィールド

繰り返しますが、管理者がcutGNU以外の実装を使用することを決定した場合、これはシステムによって異なる可能性があるため、マンページを確認して安全に確認するのが最善です。

答え3

Linuxでも動作しました。私は(Debianでは、cutコマンドを含むcoreutilsパッケージを更新した後)それに噛んでこのバグを見つけました。

これはcoreutilsのバグです。

https://bugs.launchpad.net/ubuntu/+source/coreutils/+bug/211262

誰かが意図的に以前のバージョンとの互換性を破ったが、誰もこれを修正しなかった。以前は、0が大丈夫だったように見え、1として扱われました。 0はエラーを生成します。したがって、この動作に依存するすべてのスクリプトは破損しているため、変更する必要があります。

関連情報