如何用 VI/VIM 编辑器中每次出现的不同单词替换查找单词?

Ram*_*uri 3 unix linux vi vim text-editor

例如,我有一个文本 , 10 3 4 2 10 , 4 ,10 ....

不,我想用不同的词来改变每 10 个

我知道 %s/10/replace-words/gc 但它只让我像 yes/no 一样进行交互替换,但我想用不同的单词来更改 10 的每次出现,例如 Replace1, 3, 4 , 2 , Replace2, 4, Replace3 。 ...

Dok*_*ldo 6

将每次出现的 替换10replace{index_of_match}

:let @a=1 | %s/10/\='replace'.(@a+setreg('a',@a+1))/g
Run Code Online (Sandbox Code Playgroud)

将每次出现的 替换10为预定义数组中的单词:

:let b = ['foo', 'bar', 'vim'] | %s/10/\=(remove(b, 0))/g
Run Code Online (Sandbox Code Playgroud)

将每次出现的 替换10为预定义数组中的单词以及匹配的索引:

:let @a=1 | let b = ['foo', 'bar', 'vim'] | %s/10/\=(b[@a-1]).(@a+setreg('a',@a+1))/g
Run Code Online (Sandbox Code Playgroud)

但由于无论如何您都必须输入任何单词,因此第二个和第三个功能的好处微乎其微。有关“手动”解决方案,请参阅 SpoonMeiser 的答案。

更新:如所愿,第二个示例中正则表达式部分的解释:

%= 在文档中的每一行
s/<search>/<replace>/g=s表示进行搜索和替换,g表示替换所有出现的内容。
\=将以下内容解释为代码。
remove(b, 0)删除列表索引 0 处的元素b并返回它。

所以对于第一次出现。该行将是%s/10/foo/g第二次,该列表现在只是['bar', 'vim']所以该行将是%s/10/bar/g等等

注意:这是一个快速草稿,不太可能是实现它的最佳和最干净的方法,如果有人想改进它,请随时添加评论