如何让Bash中的sort命令正确识别下划线进行排序?
解决Unix sort命令下划线排序不符合Vim字典序的问题
当前文件夹列表
执行ls -1 .得到如下结果:
$ ls -1 . _dns linux mariadb minio mongodb nginx _postgresdb _python _rabbitmq redis sphinx supervisor $
期望的Vim风格字典序排序结果
希望得到如下排序效果:
$ _dns _postgresdb _python _rabbitmq linux mariadb minio mongodb nginx redis sphinx supervisor $
sort命令的尝试结果
直接使用sort命令无法得到期望结果:
$ ls -1 . | sort _dns linux mariadb minio mongodb nginx _postgresdb _python _rabbitmq redis sphinx supervisor $
添加-g、-b、-n等参数后,结果依然不符合预期:
$ ls -1 . | sort -g _dns linux mariadb minio mongodb nginx _postgresdb _python _rabbitmq redis sphinx supervisor $ $ ls -1 . | sort -b _dns linux mariadb minio mongodb nginx _postgresdb _python _rabbitmq redis sphinx supervisor $ $ ls -1 . | sort -n _dns linux mariadb minio mongodb nginx _postgresdb _python _rabbitmq redis sphinx supervisor $
问题原因与解决方法
出现这个差异的核心原因是:Unix sort命令的排序规则受当前系统的LC_COLLATE(排序规则)环境变量影响。默认的系统locale(如en_US.UTF-8)会将下划线归类为符号,排序优先级低于字母;而Vim使用的是纯ASCII码排序规则,下划线的ASCII码(95)小于所有小写字母的ASCII码(97-122),所以会排在字母开头的文件名之前。
要让sort命令实现Vim风格的排序,只需临时将LC_COLLATE设置为C(强制使用ASCII排序规则),执行命令:
LC_COLLATE=C ls -1 . | sort
执行后就能得到符合预期的排序结果。
内容的提问来源于stack exchange,提问作者user3313834
相关产品推荐
相关产品推荐

