如何使用VIM可视块逐步增加块中的数字

时间:2019-01-13 06:19:15

标签: vim

我希望重新排列该长文件中ATOM记录后3位数列中的记录,使其从“ 1”而不是“ 534”开始。每行代表一个大型蛋白质文件中的一个原子。我可以选择带有可视块(ctrl + v)的文本块,但不确定接下来要做什么。我搜索了类似的问题,但建议的代码不起作用。

我正在使用VIM编辑器,恐怕不太熟悉编码。

例如。有人建议选择块,然后使用“:I”(无效)。其他建议:选择块,然后使用“ ctrl + a”(不起作用)。任何人都有正确的VIM方法吗? 非常感谢

ATOM 534 C ACE A 0 10.207 22.900 174.325 1.00 0.00 C

ATOM 535 O ACE A 0 10.093 22.142 173.352 1.00 0.00 O

ATOM 536 CA ACE A 0 11.342 22.737 175.312 1.00 0.00 C

ATOM 1 N PRO A 1 9.225 23.976 174.522 1.00 32.27 N

ATOM 2 CA PRO A 1 8.230 23.902 173.411 1.00 32.77 C

ATOM 3 C PRO A 1 8.827 23.261 172.170 1.00 30.28 C

3 个答案:

答案 0 :(得分:1)

这是您可以做的。

给出此文本文件:

$ cat file
Eg. Someone suggested selecting the block then use ":I" (didn't work). Other suggestion: select block then use "ctrl+a" (didn't work). Would anyone have the correct VIM method by any chance? Many thanks
ATOM 534 C ACE A 0 10.207 22.900 174.325 1.00 0.00 C
ATOM 535 O ACE A 0 10.093 22.142 173.352 1.00 0.00 O
ATOM 536 CA ACE A 0 11.342 22.737 175.312 1.00 0.00 C
ATOM      1 N PRO A 1 9.225 23.976 174.522 1.00 32.27 N
ATOM      2 CA PRO A 1 8.230 23.902 173.411 1.00 32.77 C
ATOM      3 C PRO A 1 8.827 23.261 172.170 1.00 30.28 C

Hi there just more stuff in the file.

在vim中打开文件...

enter image description here

现在键入

:2,7!sort -k2 -n

点击进入,您应该看到……

enter image description here

然后:wq就可以了!

答案 1 :(得分:0)

要用递增的数字代替,我们可以使用寄存器作为计数器;由于setreg()成功返回0,我们可以纯粹出于表达式中的副作用调用它,作为:help sub-replace-expression的一部分。

:let @a = 1 | %s/^ATOM \+\zs\d\+/\=@a + setreg('a', @a + 1)/g

该模式断言(用:help /\zs)在数字前面有ATOM,以避免其他匹配。

固定宽度的变体

如果您希望在数字变化的情况下保持相同的宽度,则需要进行以下更改:

  1. 匹配整个领域,包括领先的空格
  2. :help printf()用于数字(%3d)的右对齐固定宽度格式
:let @a = 1 | %s/^ATOM \zs\s*\d\+/\=printf('%3d', @a + setreg('a', @a + 1))/g

答案 2 :(得分:0)

您可以尝试以下操作:

Ctrl-v ..........................Select the block with the numbers
:'<,'>s/\d+/1 ...................Substitute all numbers by 1
gv ..............................Repeat the selection
o ...............................jump to the beginning of the selection
j ...............................goes to the seccond line 
g Ctrl-a.........................increase the numbers

OBS:如果您已经选择了范围,请使用gv重新选择,然后进行替换,然后重新选择并使用g Ctrl-a。有关帮助系统:h g_Ctrl-a

的更多信息

我使用j来不增加第一个数字

如果出现问题,请键入:

:e!

这将使缓冲区处于打开状态。