如何在 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
如果每个单词都不同并且无论如何都必须单独输入,这似乎不太繁琐。
例如,我有一个文本, 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
如果每个单词都不同并且无论如何都必须单独输入,这似乎不太繁琐。