`echo -e 'Q\ns\nV' sort` はソートされません。

`echo -e 'Q\ns\nV' sort` はソートされません。

なぜ:

$ echo -e 'Q\ns\nV'  | sort 

出力

Q
s
V

私のリストの順序を変更せずに(小文字/大文字を考慮しますか?)

答え1

ほとんどの言語では、s大文字と小文字に関係なく、すべてが最初にソートされます。V

ソートは、ローカライズ設定(LANGおよびLC_*変数)によって異なります。

LC_ALL=C sortバイト値の順序に基づいてソートするには、次を使用できます。ただし、マルチバイトロケールにある場合は、要件を満たしていない可能性があります。

言語順に並べ替えたいのですが、大文字が小文字より前の場合は、次のようにできます。

sed 's/./0&/g;s/0\([[:lower:]]\)/1\1/g' |
  sort |
sed 's/.\(.\)/\1/g'

これにより、小文字が他のすべての文字の後にソートされます。

$ print -l Q s d é f D É F V | sort
d
D
é
É
f
F
Q
s
V

$ print -l Q s d é f D É F V | sed 's/./0&/g;s/0\([[:lower:]]\)/1\1/g' |
 sort |
 sed 's/.\(.\)/\1/g'
D
É
F
Q
V
d
é
f
s

これは、組み合わせ要素が単一文字のロケールにのみ適用されます。

答え2

sortソート順序は、環境のロケールによって異なります。sortマンページから。

   *** WARNING *** The locale specified by the environment affects sort  order.
   Set LC_ALL=C to get the traditional sort order that uses native byte values.

POSIXまたはCロケールのため、期待sortどおりに動作します。

reedm@www:~ $ echo -e 'Q\ns\nV' | LC_ALL='' sort 
Q
s
V
reedm@www:~ $ echo -e 'Q\ns\nV' | LC_ALL='' sort --ignore-case
Q
s
V
reedm@www:~ $ echo -e 'Q\ns\nV' | LC_ALL='c' sort 
Q
V
s
reedm@www:~ $ echo -e 'Q\ns\nV' | LC_ALL='c' sort --ignore-case
Q
s
V

関連情報