【问题标题】:VIM: Finding and replacing first N occurrences of a wordVIM:查找和替换单词的前 N ​​次出现
【发布时间】:2014-11-08 12:56:06
【问题描述】:

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

N :s/word/newword/

:%s/word/newword/count

还有我可以在 google 上找到的其他命令。但它们都不起作用。

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

【问题讨论】:

  • :s/word/newword/N 是唯一有效的命令,但这将替换接下来 N 行中的第一次出现。如果您使用 /g 标志,它将替换接下来 N 行中的所有匹配项。您想要的确切计数也没有。

标签: vim vi


【解决方案1】:

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

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@:

【讨论】:

  • @romainl 你能解释一下每行和属性的含义吗?
  • @Ignite,我添加了:help 指针。如果您对我的回答的特定部分有疑问,请询问我。
  • 哇,cgn 的用法真是太巧妙了。我也可以开始使用此类命令和 vim 脚本的任何特定资源?
  • +1。 gn 也很适合 .。可以使用n 跳过模式。
【解决方案2】:

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

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

替换前 3 次出现然后停止。 您可以更改y 的数量以进行更多或更少的替换。 (也可以使用n跳过一些)

解释:这是将y 击键输入替换命令的/c 确认选项。

【讨论】:

  • :call feedkeys(repeat("y", 3) . "q") | %s/test/toast/gc 获取特定金额。其中 3 是要替换的出现次数。
  • 当我意识到我的测试/吐司还在测试中时,我有点笑了,但你明白了 :)
  • 这个解决方案既易记又易读!十分优雅!我喜欢它不仅仅是“复杂的神秘 vim 魔法字符”......;)谢谢!
【解决方案3】:

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

:%s/word/newword/gc

然后,Vim 会要求确认每次出现的 word,这样您就可以有选择地更改其中的一些,但不能更改其他的。

【讨论】:

  • 当 N 很大时会非常繁琐且人为计数错误的可能性很高
  • 是的,没错。但是当 N 不大时,它可以更好地控制更改的内容。
  • 另外,这个命令比这个线程中提出的其他命令更容易理解。
【解决方案4】:

我的PatternsOnText plugin 提供(以及许多其他命令)以yyynyn1-5 形式获取答案的命令:

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

【讨论】:

    猜你喜欢
    • 2011-03-05
    • 2010-12-19
    • 2017-09-18
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    相关资源
    最近更新 更多