Vim

Vim :s 替換一行中的前 N < g 次出現

  • January 22, 2020

在 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

MNvim替換為您想要的值(如果您不想自己做,甚至可以讓做簡單的心算)。請注意,這.是 VimL 的字元串連接運算符。顯然,這只節省了大M的擊鍵。如果您經常使用此功能,則將上述內容放入某種自定義命令或函式中可能會節省您的時間,因為它需要大量輸入。

引用自:https://unix.stackexchange.com/questions/27178