[英]How to use VIM visualblock to incrementally increase numbers in a block
我希望對長文件中ATOM記錄后3位數的列中的記錄重新排序,從“ 1”而不是“ 534”開始。 每行代表一個大型蛋白質文件中的一個原子。 我可以選擇帶有可視塊(ctrl + v)的文本塊,但不確定接下來要做什么。 我搜索了類似的問題,但建議的代碼不起作用。
我使用的是VIM編輯器,恐怕不太熟悉編碼。
例如。 有人建議選擇塊,然后使用“:I”(無效)。 其他建議:選擇塊,然后使用“ ctrl + a”(不起作用)。 任何人都有正確的VIM方法嗎? 非常感謝
原子534 C ACE A 0 10.207 22.900 174.325 1.00 0.00 C
原子535 O ACE A 0 10.093 22.142 173.352 1.00 0.00 O
原子536 CA ACE A 0 11.342 22.737 175.312 1.00 0.00 C
原子1 N PRO A 1 9.225 23.976 174.522 1.00 32.27 N
原子2 CA PRO A 1 8.230 23.902 173.411 1.00 32.77 C
原子3 C PRO A 1 8.827 23.261 172.170 1.00 30.28 C
這是您可以做的。
給定此文本文件:
$ 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中打開文件…
現在輸入
:2,7!sort -k2 -n
按Enter鍵,您應該會看到…
然后:wq
,你很好!
要替換為遞增的數字,我們可以使用寄存器作為計數器; 由於setreg()
成功返回0,我們可以純粹出於表達式中的副作用調用它,作為:help sub-replace-expression
。
:let @a = 1 | %s/^ATOM \+\zs\d\+/\=@a + setreg('a', @a + 1)/g
該模式斷言(使用:help /\\zs
)在數字前有ATOM
,以避免其他匹配。
如果您希望盡管數字不斷變化而保持相同的寬度,則需要進行以下更改:
:help printf()
可以對數字( %3d
)進行右對齊的固定寬度格式 :let @a = 1 | %s/^ATOM \zs\s*\d\+/\=printf('%3d', @a + setreg('a', @a + 1))/g
您可以嘗試以下方法:
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!
這會在打開緩沖區時獲得緩沖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.