对多列进行排序并忽略vim中的字段

时间:2014-01-04 18:45:02

标签: shell sorting vim

是否可以对多列进行排序并忽略以#开头的某些行? 我有这样的文字:

#Comments
#More comments
foo;1;1
foo;3;2
bar;2;1

我想对第一个数字进行排序,如果最后一个数字相等。 我试过这个:

:%!sort -t';' -k2n -k3n

但这会影响评论部分。 我知道我可以让vim忽略这样的评论:

:sort /^#/

但我现在如何选择字段? shell排序是否有字段忽略器?或者VIM排序可以使用字段吗?

顺便说一句,评论部分的长度会增加,所以头部/尾部不起作用。

1 个答案:

答案 0 :(得分:1)

我不认为

:sort /^#/

做你想要的。它将对注释进行排序,将它们放在缓冲区的末尾,并将其他行保留为原始顺序。更接近你想要的是

:sort /;/

这将使所有注释保留在缓冲区的顶部,按原始顺序排序,并在第一个; 之后的行部分排序。可能是字典排序不是你想要的。相反,你可以使用

:sort /;/ n

这将进行数字排序,但忽略第一个数字后的行部分。

为了避免对碰巧包含; 字符的注释行进行排序,您可以使用更复杂的模式:

:sort /^\(\s*#\)\@!.\{-};/ n

或(使用我之前从未尝试过的功能)

:sort /^\s*[^#]\&.\{-\};/ n

我老了,使用vim的默认设置,但很多人更喜欢\v(非常神奇)的设置。这使得这些更简单:

:sort /\v^(\s*#)@!.{-};/ n
:sort /\v^\s*[^#]&.{-};/ n

OTOH,您使用外部排序建议的版本似乎完美无缺。

$ sort --version
sort (GNU coreutils) 5.93