我看到其他问题涉及找到第n次出现的单词/模式,但我找不到你如何实际替换vim中第n次出现的模式。有一种明显的方法可以对所有出现的事件进行硬编码,例如
:s/.*\(word\).*\(word\).*\(word\).*/.*\1.*\2.*newWord.*/g
有更好的方法吗?
答案 0 :(得分:9)
有关信息,
s/\%(\(pattern\).\{-}\)\{41}\zs\1/2/
也可以替换第42次。但是,我更喜欢the solution given by John Kugelman这更简单 - 即使它不会将自己限制在当前行。
答案 1 :(得分:7)
您可以通过使用多次搜索更简单地完成此操作。 :s/pattern/repl/
命令中的空模式表示替换最近的搜索结果。
:/word//word//word/ s//newWord/
or
:/word//word/ s/word/newWord/
然后,您可以通过执行@:
,甚至10@:
多次重复此操作,再重复该命令10次。
或者,如果我以交互方式进行此操作,我会做类似的事情:
3/word
:s//newWord/r
这会在光标处找到第三次出现 word 然后执行替换。
答案 2 :(得分:5)
用REPLACE替换每行的第N个 th 出现的PATTERN。
:%s/\(\zsPATTERN.\{-}\)\{N}/REPLACE/
答案 3 :(得分:1)
这可以回答你的实际问题,但不是你的意图。
你问过要更换一个单词的第n个出现(但似乎意味着"在一行中#34;)。这是问题的答案,如果有人发现它像我做的那样=)
对于奇怪的任务(比如需要替换每12次"狗"用" parrot"),我喜欢使用递归录音。
首先在@q
中删除录音qqq
现在在q
中开始新的录音qq
接下来,手动做你想做的事情(使用上面的例子,替换第12次出现" dog"用" parrot"):
/dog
nnnnnnnnnnn
删除"狗"并进入插入
diwi
输入parrot
parrot
现在播放你当前空的" @ q"记录
@q
什么也没做。
最后,停止录制:
q
现在你在@q中的录音最后会自动调用。但是因为它通过名称调用记录,所以它不再是空的。所以,打电话给录音:
@q
它将重放录音,然后在最后,作为最后一步,再次重播。它将重复此操作直到文件结束。
TLDR;
qq
q
/dog
nnnnnnnnnnndiwiparrot<esc>
@q
q
@q
答案 4 :(得分:1)
要替换vim中一行中第n个出现的PATTERN,除了上面的答案外,我只是想解释模式匹配,即它实际上如何工作以便于理解。
所以我将讨论
\(.\{-}\zsPATTERN\)\{N}
解决方案,
我将使用的示例是替换句子(字符串)中第二个超过1个空格的地方。 根据模式匹配码->
根据zs文档,
\zs
-水平滚动文本以将光标定位在开始位置(左
侧面)。
.\{-}
尽可能少(0)个(*)
这里。与任何字符和{}次匹配。 例如ab {2,3} c,它将与b出现2或3次的位置匹配。
在这种情况下,我们也可以使用.*
,它是0或尽可能多的。
根据vim非贪婪文档,“ {-}”与“ *”相同,但使用最短匹配优先算法。
\{N}
->匹配前一个原子的n
/\<\d\{4}\>
精确搜索4位数字,与/ \ <\ d \ d \ d \ d>
**忽略这些\<\>
,它们仅用于精确搜索,例如搜索fred-> \<fred\>
只会搜索fred而不是alfrred。
\( \)
结合了整个模式。
模式是您要匹配的模式-> \s\{1,}
(\ s-空格和{1,}如上文所述,搜索1个或多个空格)
“ abc字幕定义”
:%s/\(.\{-}\zs\s\{1,}\)\{2}/,/
OUTPUT->“ abc subtring,def”
# explanation: first space would be between abc and substring and second
# occurence of the pattern would be between substring and def, hence that
# will be replaced by the "," as specified in replace command above.
答案 5 :(得分:0)
好吧,如果你做/gc
,那么你可以计算它要求你确认的次数,并在你到达第n时继续更换:D