如何用 vim 中的递增计数器替换每次出现的字符串?

如何用 vim 中的递增计数器替换每次出现的字符串?

我在一个文件中有 203 个该单词的实例ubuntu,我想将每个实例替换为UBUNTU_X,其中“X”是一个递增计数器。换句话说,原始文件是:

ubuntu xxxxxxxx ubuntu xxxxxxxx ubuntu xxxubuntuxxx xxxubuntu ubuntuxxxxxx ...

我想将其替换为:

UBUNTU_1 xxxxxxxx UBUNTU_2 xxxxxxxx UBUNTU_3 xxxUBUNTU_4xxx xxxUBUNTU_5 UBUNTU_6xxxxx ... 

最后一次出现的情况必须是UBUNTU_203

答案1

ggOUbuntu_0Esc0"ndeddqq/\<Ubuntu\>^Mde"nP^Ab"nyeq999@q

如果在正常模式下输入,这应该可以实现您想要的效果。

解释:

  • gg- 转到文件的第一行
  • O- 在当前行上方创建一个新行并进入插入模式
  • Ubuntu_0- 输入文字
  • Esc- 退出插入模式,还可以使用Ctrl[
  • 0- 转到当前行的开头
  • "nde- 进入寄存器n,删除到单词末尾
  • dd- 删除当前行
  • qq- 开始将宏记录到寄存器 q 中
  • /\<Ubuntu\>^M- 搜索Ubuntu。 \< 和 \> 表示单词边界,Ctrl-M 与按 Enter 相同。
  • de- 删除到词尾
  • "nP- 将寄存器n的内容放在光标位置之前
  • ^A- Ctrl-A,将光标下的数字加一
  • b- 转到当前单词的开头
  • "nye- 进入寄存器 n 将文本复制到当前单词的末尾
  • q- 停止录制宏
  • 999@q\<Ubuntu\>- 运行寄存器 q 中记录的宏 999 次(或当不再找到模式时停止)

可以根据您的具体要求稍作修改。例如,我假设您只想将“Ubuntu”作为整个单词进行匹配。我还假设您只想匹配给定的大小写,或者,如果您启用了忽略大小写,则您不介意“ubuntu”的各种大小写全部转换为“Ubuntu”。

答案2

一些 Linux 发行版已经编译了支持 Perl 的 vim。如果是这种情况,你有一个:perldo command和一个:perl command

:perldo  s/ubuntu/"UBUNTU" . ++$a/ge 

相关内容