[英]Vim - Increase number without changing column width
我正在處理固定寬度的文件格式,因此需要增加某些列中的所有數字。 我有一個簡單的宏,該宏將一個值添加到一個數字,移至下一行並重復(例如2aj)。但是,這些數字從1開始,通常在10000以上結束,因此列寬變得混亂,例如(下划線為空格) ,此示例僅涵蓋從9跳到10的跳動)
FOO_7_BAR
FOO_8_BAR
FOO_9_BAR
變
FOO_9BAR
FOO_10_BAR
FOO_11_BAR
(請注意將破壞我的程序的新文本列)
當我需要時
FOO_9_BAR
FOO10_BAR
FOO11_BAR
我一直在手動操作,並從前9列中刪除一個空格,然后從90處刪除,然后是900個,但是我正在尋找一種更可靠的方式來處理此問題,而無需使用不同的宏處理前10、100、1000等或任何手動輸入。
謝謝。
這需要一些手動黑客手段,但比手動刪除空格要好。
不過,您可能還可以編寫一個通過Vimscript自動執行此操作的函數!
首先,找到最短線的長度。 您可以通過ex執行此操作。 :echo col("$")
最短的一行。
然后,運行以下命令:
:g/.\{NUM\}/exec "norm! /[0-9]\<cr>X"
將上面命令中的NUM替換為您在上一步中獲得的原始編號。
以下是其工作原理的說明:
:g/.\{NUM\}/ Find lines that are too long
exec "norm! A common idiom: build a string to execute in normal mode
/[0-9]<cr> Find the first number on the line
X Delete the space before it (equivalent to "hx")
然后簡單地重復運行同一命令(您可以通過按: Up Return來執行此操作),直到所有行的長度都相同為止–一旦出現這種情況,將會導致錯誤(因為它將找不到任何匹配的行)。
這是整個過程的簡短動畫:
可以使用:s
和子替換表達式來完成。
:%s/\v([^0-9]*)(\d+)/\=strpart(submatch(1), 0, 5 - len(submatch(2))).submatch(2)
這個想法是我們捕獲數字和數字本身之前的部分。 替換通過\\=
執行vim表達式,將兩個捕獲組放回一起。 但是,通過strpart()
將第一個捕獲組strpart()
固定寬度(在此示例中為5)減去第二個捕獲組的長度len(submatch(2))
。
有關更多幫助,請參見:
:h sub-replace-expression
:h strpart()
:h len()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.