> echo "fdp.txtUNE/ser/redaeR/daerorca/bil/rsu\nf.dpu" | sort -s
fdp.txtUNE/ser/redaeR/daerorca/bil/rsu
f.dpu
自“。”默认情况下不是字段分隔字符,前3个 人物似乎说:
f< = f(没关系)
d< =。 (用ASCII,“。”<“d”,但我可以用排序决定字母 在标点符号之前)
p< = d(这是有问题的)
更糟糕的是,如果我从第二个字符串中删除一个字母,结果 相反:
> echo "fdp.txtUNE/ser/redaeR/daerorca/bil/rsu\nf.dp" | sort -s
f.dp
fdp.txtUNE/ser/redaeR/daerorca/bil/rsu
这里有什么可怕的东西,我该如何阻止呢?我以为“-s” 就足够了,但显然不是。
据我所知,'sort'认为“f.dpu”> “fdp.t”因为“你”> “T”。但是,永远不应该进行这种比较,因为之前的字符已经不同了。
作为一个注释,我在没有“-s”的情况下得到相同的结果。
编辑:将环境变量LC_ALL设置为“C”修复此问题,但仍然让我感到困惑的是,将LC_ALL(语言环境)留空会产生不一致的结果(不同是好的,不一致是坏的)。
答案 0 :(得分:1)
首先,我必须打开扩展的回声:
$ shopt -s xpg_echo
现在,我会按你的意思运行:
BASH 3.2:$ echo "fdp.txtUNE/ser/redaeR/daerorca/bil/rsu\nf.dpu" | sort -s
f.dpu
fdp.txtUNE/ser/redaeR/daerorca/bil/rsu
这是.
在d
之前排序的正确排序顺序,因此f.dpu
应该排在第一位。
我没有得到你的结果。可能是因为我使用的是Mac OS X而不是Linux。但是,两者上的-s
选项都表示“通过禁用最后的比较来稳定排序”。它们是否设置了可能导致这些问题的其他shell选项?
这是我的shopt设置:
$ shopt
cdable_vars off
cdspell off
checkhash off
checkwinsize on
cmdhist on
compat31 off
dotglob off
execfail off
expand_aliases on
extdebug off
extglob on
extquote on
failglob off
force_fignore on
gnu_errfmt off
histappend off
histreedit off
histverify off
hostcomplete on
huponexit off
interactive_comments on
lithist on
login_shell off
mailwarn off
no_empty_cmd_completion off
nocaseglob off
nocasematch off
nullglob off
progcomp on
promptvars on
restricted_shell off
shift_verbose off
sourcepath on
xpg_echo on
与我默认的三个不同之处是exglob
,lithist
和xpg_echo
,我只是为了让它发挥作用而设置。
你能想到其他可能发生的事情吗?