用vim中的第n个单词替换

时间:2010-06-19 00:40:00

标签: regex vim sed substitution

我看到其他问题涉及找到第n次出现的单词/模式,但我找不到你如何实际替换vim中第n次出现的模式。有一种明显的方法可以对所有出现的事件进行硬编码,例如

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

有更好的方法吗?

6 个答案:

答案 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个空格的地方。 根据模式匹配码->

  1. 根据zs文档,

    \zs-水平滚动文本以将光标定位在开始位置(左 侧面)。

  2. .\{-}尽可能少(0)个(*)

    这里。与任何字符和{}次匹配。 例如ab {2,3} c,它将与b出现2或3次的位置匹配。

    在这种情况下,我们也可以使用.*,它是0或尽可能多的。 根据vim非贪婪文档,“ {-}”与“ *”相同,但使用最短匹配优先算法。

  3. \{N}->匹配前一个原子的n

    /\<\d\{4}\>精确搜索4位数字,与/ \ <\ d \ d \ d \ d>

    相同

    **忽略这​​些\<\>,它们仅用于精确搜索,例如搜索fred-> \<fred\>只会搜索fred而不是alfrred。

  4. \( \)结合了整个模式。

  5. 模式是您要匹配的模式-> \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