如何在VI/VIM编辑器中替换每个出现的不同单词?

3
例如,我有一段文本,10 3 4 2 10,4,10....
现在我想要用不同的单词替换每个10。
我知道%s/10/replace-words/gc,但它只能让我交互式地替换,像是yes/no,但我想要更改每个10的出现,使用不同的单词,比如replace1,3,4,2,replace2,4,replace3....

在所示示例中,替换的单词具有递增的数字,您需要这样还是替换可以是随机的? - Sundeep
2个回答

6
替换每个出现的10replace{index_of_match}:
: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的“手动”解决方案的答案。
更新:按要求,在第二个示例中解释正则表达式部分:
%=文档中的每一行 s / / / g = s表示执行搜索和替换,g表示替换每个出现。 \ =将以下内容解释为代码。 remove(b,0)从列表b中删除并返回索引0处的元素。
所以对于第一次出现。行将是%s / 10 / foo / g第二次,列表现在仅为['bar','vim'],因此行将是%s / 10 / bar / g依此类推
注意:这是一个快速草稿,可能不是实现它的最佳和最清洁的方法,如果有人想改进它,请随意添加评论

如果每个替换的单词都不同呢?谢谢,伙计 :) - rcShahi
好的,谢谢兄弟。我在使用Vi方面还很新,如果您能详细解释一下这个命令中使用的每个术语,那就太好了。 - rcShahi
这里的三个中哪一个?你熟悉编程吗?如果是,那么你应该能够找出它的作用(http://learnvimscriptthehardway.stevelosh.com/ 是一个很好的资源,或者使用谷歌)。如果不熟悉,解释起来就有些困难了。我建议先学习vim的用法。但是,如果你对这个命令的某个部分有具体问题,我很乐意帮助你。 - Doktor OSwaldo
在第三个例子中,你创建了一个数组对吧?但我想更多地了解第三个例子中正则表达式的部分。 - rcShahi
是的,这是 Vimscript 中的列表而不是数组,但对于这个例子来说是一样的。我已经在答案中解释了。 - Doktor OSwaldo
现在我完全明白了。非常感谢您提供这么好的解释。 - rcShahi

1

您想要的单词是否有规律可循,还是需要在每个替换单词的出现时手动输入替换的单词?

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

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

如果每个单词都不同且必须单独键入,那么这似乎并不太繁琐。

这在我的情况下会抛出错误,并显示“E486:未找到模式:10cw”。 - rcShahi
@rcShahi 这是因为它意味着 /10<CR>cw。这很容易被忘记,因为对于 Vim 用户来说,你正在搜索 10 是很明显的。 - Doktor OSwaldo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接