Vim
Vim :s 替換一行中的前 N < g 次出現
在 vim 中,我有時會替換一行中前幾次出現的匹配項,但並非每個人都喜歡
g
。例如:a a a a a
到
b b b a a
我知道我可以使用
:s/a/b/[enter]:[up][enter]:[up][enter]
,但是重複三次就夠乏味了,我的行可能有 10 多個替換。我試過了:
:s/a/b/3g
: vim 抱怨尾隨字元。:s/a/b/3
: 更改此行和以下兩行的第一次出現。3:s/a/b
: 和以前一樣。:s/a/b/g3
: 更改此行和接下來的兩行中的所有事件。:3s/a/b
: 更改第 3 行的第一次出現。:/a/,3/a/s/a/b
: 更改文件中包含的下一a
行和第三行之間的每一行的第一次出現a
(如果需要,提示反轉)。:/a/,/\([^a]*a\)\{3\}/s/a/b/
: 在 this 和 next 之間更改每行的第一次出現,並帶有 3a
秒(這不容易擴展到多字元搜尋)。以及其他各種定址模式,但都沒有奏效。我必須說,我已經學到了很多關於
:s
試圖找到這個問題的答案的命令,但我仍然沒有解決它。有人知道怎麼做嗎?
(特定範圍的獎勵積分,例如第二次到第四次出現)
基於
:s/pattern/replacement/gc
Samus_ 的想法(當模式包含在替換字元串中時,這似乎是確保正確操作的最簡單方法),在一行中替換第 2 到第 4 次出現::call feedkeys("nyyyq") | s/pat/string/gc
feedkeys()
是將輸入字元串塞入鍵盤輸入隊列的函式。關鍵是提前數數,這樣您就不必擔心數數失去或被打斷。對於更一般的情況,要在單行上替換第M到第 N次出現的**N大於或等於非常大的M:
:call feedkeys(repeat("n", M-1) . repeat("y", N-M+1) . "q") | s/pat/string/gc
將M和N
vim
替換為您想要的值(如果您不想自己做,甚至可以讓做簡單的心算)。請注意,這.
是 VimL 的字元串連接運算符。顯然,這只節省了大M的擊鍵。如果您經常使用此功能,則將上述內容放入某種自定義命令或函式中可能會節省您的時間,因為它需要大量輸入。