如何在 VI/VIM 编辑器中用不同的词替换查找词?

How to replace finding words with the different in each occurrence in VI/VIM editor ?

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

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

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

replace{index_of_match}替换每个出现的10

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

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

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

用预定义数组中的单词替换每次出现的 10,匹配索引:

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

但是由于无论如何您都必须输入任何单词,因此第二个和第三个功能的好处是微乎其微的。请参阅 SpoonMeiser 对 "manual" 解决方案的回答。

更新:如愿以偿,对第二个例子中regex部分的解释:

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

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

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

是否有您想要的字词的模式,或者您想在每次出现要替换的字词时键入每个字词?

如果我用不同的词替换每个“10”实例,我可能会手动完成:

/10
cw
<type word>ESC
ncw
<type word>ESC
ncw
<type word>ESC

如果每个单词都不同并且无论如何都必须单独输入,这似乎不太繁琐。