我看到了其他問題,這些問題涉及到發現詞/模式的第n次出現,但我無法找到如何替換第n次出現的詞/ vim中的模式。有硬編碼所有出現的類似在vim中替換第n個詞的出現
:s/.*\(word\).*\(word\).*\(word\).*/.*\1.*\2.*newWord.*/g
的顯而易見的方法是有這樣做的更好的辦法?
我看到了其他問題,這些問題涉及到發現詞/模式的第n次出現,但我無法找到如何替換第n次出現的詞/ vim中的模式。有硬編碼所有出現的類似在vim中替換第n個詞的出現
:s/.*\(word\).*\(word\).*\(word\).*/.*\1.*\2.*newWord.*/g
的顯而易見的方法是有這樣做的更好的辦法?
你可以做到這一點更簡單通過使用多個搜索。 :s/pattern/repl/
命令中的空白模式意味着替換最近的搜索結果。
:/word//word//word/ s//newWord/
or
:/word//word/ s/word/newWord/
然後,您可以通過做@:
,甚至[email protected]:
10分多次重複命令重複此多次。
或者,如果我這樣做,我交互會做這樣的事情:
3/word
:s//newWord/r
這將找到的詞的第三次出現在首發光標,然後進行替換。
Hrm,如果第一個單詞是我們正在尋找的單詞,那麼仍然存在一些問題,'3 /單詞「將使我們到達第四位。另外,當我在找到第n個實例後嘗試替換時,它仍然會替換第一個實例。 – 2010-06-19 01:21:42
糟糕,是的,':s'需要'r'標誌。 – 2010-06-19 01:29:46
'3/word'會發現第三次出現在光標處。如果您想從那裏開始,請使用'gg'轉到文件頂部。請注意,'3/word'等效於三次輸入'/ word',所以它肯定會發現第三次出現。 – 2010-06-19 01:31:01
好吧,如果你這樣做/gc
,那麼你可以指望它會要求你進行確認的次數,並與當你第n個替代繼續:d
是的,但我想在沒有確認的情況下替換第n次發生(如果我必須寫腳本來完成)。 – 2010-06-19 00:46:31
如果你想以你的方式替換第100個事件,這將是一個痛苦...... – 2014-02-08 07:21:51
有關信息,
s/\%(\(pattern\).\{-}\)\{41}\zs\1/2/
也適用於替代第42發生。不過,我更喜歡the solution given by John Kugelman這更簡單 - 即使它不會將自己限制在當前行。
@ Luc Hermitte:你能告訴我你的答案中「\%」是什麼意思。看起來它是VIM無法識別的運營商。 – 2014-02-08 07:24:18
這就像'\(',但它告訴不要將括號中的內容與'\ 1'匹配,見':h/\%(',IIRC – 2014-02-09 01:55:27
這回答你的實際問題,但不是你的意圖。
您詢問有關替換單詞的第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
替換替換爲一個線每個N 第發生模式的。
:%s/\(\zsPATTERN.\{-}\)\{N}/REPLACE/
顯然有不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