`echo -e 'Q\ns\nV' | sort` 不排序

`echo -e 'Q\ns\nV' | sort` 不排序

为什么 :

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

输出

Q
s
V

不改变我的列表的顺序(考虑到小写/大写?)

答案1

在大多数语言中,无论大小写,都s在前面排序。V

排序取决于本地化设置(LANGLC_*变量)。

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

相关内容