1

为什么我不能在第三列对下表进行排序?

第 1 列可以使用:sort /.*\%1v/

Audi       ***     ****      **
BMW        *****   ***       *****
Mercedes   ****    *****     ***
Opel       ***     ***       *

第 2 列也可以使用:sort /.*\%2v/

BMW        *****   ***       *****
Mercedes   ****    *****     ***
Opel       ***     ***       *
Audi       ***     ****      **

但第 3 列不排序:sort /.*\%3v/

BMW        *****   ***       *****
Audi       ***     ****      **
Opel       ***     ***       *
Mercedes   ****    *****     ***

我究竟做错了什么?

4

2 回答 2

3

你被一个误解愚弄了:\%v原子指定字符列(但不将它们作为匹配项使用);我认为您想根据报纸或表格中的空格分隔文本/所谓的“列”进行排序。

即您的第一个示例对字符 B、A、O 和 M 进行排序;第二个在 M、u、p、e 上,而不是*'s 上(取决于您的语言环境,大写字母排在小写之前)。

如果有:set ruler,您会在右下角看到当前列。在您的示例中,第三个文本列从位置 20 开始,因此您必须使用

:%sort /.*\%20v/

在第三个文本列上排序。

对于 Vim,虚拟列是指屏幕列,以一个(单宽)字符占用的空间来衡量。还有column,这意味着(有点不直观)字符表示的字节数。这种区别对于非 ASCII、不可打印和<Tab>字符很重要。

于 2013-09-21T19:58:47.027 回答
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/
于 2013-09-21T20:12:58.093 回答