VIM:查找并替换单词的前 N 次出现

问题描述 投票:0回答:5

我正在编辑一个文件,我只想用另一个单词更改一个特定单词,但仅限于前 N 个出现的单词。我尝试了多个命令

N :s/word/newword/

:%s/word/newword/count

以及我可以在谷歌上找到的其他命令。但它们都不起作用。

编辑:: Vim 命令是首选。但也可以使用 Vim 脚本。我之前没有任何 vim 脚本编写经验。

vim vi
5个回答
23
投票

使用一次性记录可以让您准确控制所做的更改数量:

qq             " start recording in register q
/foo<CR>       " search for next foo
cgnbar<Esc>    " change it to bar
q              " end recording
11@q           " play recording 11 times

参见

:help recording
:help gn

另一种方式,使用

:normal
:

:norm! /foo<C-v><CR>cgnbar<C-v><Esc>     <-- should look like this: :norm! /foo^Mcgnbar^[
11@:

参见

:help :normal
:help @:

或者简单地说:

:/foo/|s//bar<CR>
11@:

12
投票

虽然有点长,但你可以这样做:

:call feedkeys("yyyq") | %s/word/newword/gc

替换前 3 个出现的位置,然后停止。 您可以更改

y
的数量以进行更多或更少的替换。 (也可以使用
n
跳过一些)

说明:这是将

y
按键输入到替换命令的
/c
确认选项中。


7
投票

我不确定是否指定前 N 次出现,但我经常使用这个命令:

:%s/word/newword/gc

Vim 然后要求确认每次出现的

word
,这样你就可以有选择地更改一些,但不能更改其他。


2
投票

我的 PatternsOnText 插件 提供了(除其他外)一个以

yyynyn
1-5
形式获取答案的命令:

:%SubstituteSelected/word/newword/g 1-5

0
投票

可以通过使用多个正则表达式来完成:

:%s/\(word.\{-}\)\{3}\zs/*

这只是在第三次重复时放置了一个特殊的“停止”代码

*

:%s/word[^*]/newword /g
这会替换所需的单词,直到“停止字符”

:%s/\*//
这会删除“停止字符”

© www.soinside.com 2019 - 2024. All rights reserved.