这可能是由于语言环境的差异造成的。在en_US.UTF-8
语言环境中,下划线 ( _
) 在字母和数字之后排序,而在POSIXC
语言环境中,它们在大写字母和数字之后排序,但在小写字母之前。
# won't change LC_COLLATE=C after execution
$ LC_COLLATE=C sort filename
您还可以sort --debug
用于显示有关一般排序行为的更多信息:
$ (echo 'foo_bar'; echo 'fooAbar'; echo 'foo0bar'; echo 'fooabar') |
LC_COLLATE=en_US.UTF-8 sort --debug
sort: using ‘en_US.UTF-8’ sorting rules
foo0bar
fooabar
fooAbar
foo_bar
$ (echo 'foo_bar'; echo 'fooAbar'; echo 'foo0bar'; echo 'fooabar') |
LC_COLLATE=C sort --debug
sort: using simple byte comparison
foo0bar
fooAbar
foo_bar
fooabar
也如this answer所示,您可以使用上述公式强制LC_COLLATE=C
执行单个命令,而无需修改您的shell环境: