2010-06-19 67 views
13

我看到了其他問題,這些問題涉及到發現詞/模式的第n次出現,但我無法找到如何替換第n次出現的詞/ vim中的模式。有硬編碼所有出現的類似在vim中替換第n個詞的出現

:s/.*\(word\).*\(word\).*\(word\).*/.*\1.*\2.*newWord.*/g 

的顯而易見的方法是有這樣做的更好的辦法?

+0

顯然有不VIM單曲///'是SED,而是:http://vim.1045645.n5.nabble.com/replace-nth-occurrence-on-each-line-like- sed-td1169460.html – keflavich 2011-11-04 21:44:45

回答

4

你可以做到這一點更簡單通過使用多個搜索。 :s/pattern/repl/命令中的空白模式意味着替換最近的搜索結果。

:/word//word//word/ s//newWord/ 
or 
:/word//word/ s/word/newWord/ 

然後,您可以通過做@:,甚至[email protected]: 10分多次重複命令重複此多次。

或者,如果我這樣做,我交互會做這樣的事情:

3/word 
:s//newWord/r 

這將找到的詞第三次出現在首發光標,然後進行替換。

+0

Hrm,如果第一個單詞是我們正在尋找的單詞,那麼仍然存在一些問題,'3 /單詞「將使我們到達第四位。另外,當我在找到第n個實例後嘗試替換時,它仍然會替換第一個實例。 – 2010-06-19 01:21:42

+0

糟糕,是的,':s'需要'r'標誌。 – 2010-06-19 01:29:46

+0

'3/word'會發現第三次出現在光標處。如果您想從那裏開始,請使用'gg'轉到文件頂部。請注意,'3/word'等效於三次輸入'/ word',所以它肯定會發現第三次出現。 – 2010-06-19 01:31:01

0

好吧,如果你這樣做/gc,那麼你可以指望它會要求你進行確認的次數,並與當你第n個替代繼續:d

+0

是的,但我想在沒有確認的情況下替換第n次發生(如果我必須寫腳本來完成)。 – 2010-06-19 00:46:31

+4

如果你想以你的方式替換第100個事件,這將是一個痛苦...... – 2014-02-08 07:21:51

8

有關信息,

s/\%(\(pattern\).\{-}\)\{41}\zs\1/2/ 

也適用於替代第42發生。不過,我更喜歡the solution given by John Kugelman這更簡單 - 即使它不會將自己限制在當前行。

+0

@ Luc Hermitte:你能告訴我你的答案中「\%」是什麼意思。看起來它是VIM無法識別的運營商。 – 2014-02-08 07:24:18

+2

這就像'\(',但它告訴不要將括號中的內容與'\ 1'匹配,見':h/\%(',IIRC – 2014-02-09 01:55:27

1

這回答你的實際問題,但不是你的意圖。

您詢問有關替換單詞的第n次出現(但似乎意味着「在一行內」)。這裏有個問題的答案,如果有人發現它就像我做的那樣=)

對於奇怪的任務(比如需要用「鸚鵡」來替換第12次出現的「狗」),我喜歡使用遞歸錄製。

首先空白的@q記錄

qqq 

現在開始一個新的記錄在Q

qq 

接下來,做手工你想要做的(使用上面的例子中的東西,更換「狗」與「鸚鵡」第12次出現):

/dog 
nnnnnnnnnnn 

刪除「狗」並插入

diwi 

型鸚鵡

parrot 

現在玩你現在還是空的 「@q」 記錄

@q 

它什麼都不做。

最後,停止記錄:

q 

現在你在@q記錄在最後調用自身。但是因爲它的名字叫,所以錄像就不會是空的了。所以,請致電錄音:

@q 

它會重放錄音,然後在最後一步作爲最後一步重播自己。它會重複這個直到文件結束。

TLDR;

qq 
q 
/dog 
nnnnnnnnnnndiwiparrot<esc> 
@q 
q 
@q 
2

替換替換爲一個線每個N 發生模式的。

:%s/\(\zsPATTERN.\{-}\)\{N}/REPLACE/