为什么 :
$ 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