为什么我不能在第三栏中对下表进行排序?
第1列按:sort /.*\%1v/
排序:
Audi *** **** **
BMW ***** *** *****
Mercedes **** ***** ***
Opel *** *** *
第2列也可以使用:sort /.*\%2v/
排序:
BMW ***** *** *****
Mercedes **** ***** ***
Opel *** *** *
Audi *** **** **
但是第3列没有按:sort /.*\%3v/
排序:
BMW ***** *** *****
Audi *** **** **
Opel *** *** *
Mercedes **** ***** ***
我做错了什么?
答案 0 :(得分:3)
你被一种误解所欺骗:\%v
原子指定了字符列(但不会将它们作为匹配使用);我想你想根据空白分隔的文本/报纸或表格中所谓的“列”进行排序。
即。你的第一个例子对字符B,A,O和M进行排序;第二个关于*
上的M,u,p,e,不(取决于您的语言环境,大写字母排在小写之前)。
如果您有:set ruler
,则会在右下角看到当前列。在您的示例中,第三个文本列从位置20开始,因此您必须使用
:%sort /.*\%20v/
对第三个文本列进行排序。
对于Vim,虚拟列表示屏幕列,以一个(单宽)字符占用的值来衡量。还有列,这意味着(有点不直观地)字符表示的字节数。这种区别对非ASCII,不可打印和<Tab>
字符很重要。
答案 1 :(得分:2)
你做错了是考虑
**
*****
***
*
作为“虚拟专栏”。
“虚拟列”是单格宽列。
在您的第一个代码段中,这些是您匹配的列:
\%1v \%2v \%3v
A u d
B M W
M e r
O p e
因此,您的行不按星号数排序,而是按字母顺序排列。
我已尝试使用以下命令按星号数量排序,但它们似乎不可靠。
:%sort /.*\%12c.*\%16c/
:%sort /.*\%20c.*\%24c/
:%sort /.*\%30c.*\%34c/