【问题标题】:How to replace finding words with the different in each occurrence in VI/VIM editor ?如何用 VI/VIM 编辑器中每次出现的不同替换查找单词?
【发布时间】:2017-09-18 06:03:08
【问题描述】:

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

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

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

【问题讨论】:

  • 在示例中,替换词有递增的数字,是你需要的还是替换可以是随机的?

标签: linux unix vim text-editor vi


【解决方案1】:

将每次出现的10 替换为replace{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/<search>/<replace>/g = s 表示进行搜索和替换,g 表示替换每个出现。
\= 将以下内容解释为代码。
remove(b, 0) 删除列表 b 的索引 0 处的元素并返回它。

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

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

【讨论】:

  • 如果每个替换词不同?并感谢人:)
  • 好的,谢谢兄弟,我是 vi 新手,所以如果您详细说明此命令中使用的每个术语会很棒
  • 这三个是哪一个?你熟悉编码吗?那么你应该能够找出它的作用(learnvimscriptthehardway.stevelosh.com 是一个很好的来源,或者谷歌)如果没有,那就太多了。我建议先学习 vim 的用法。但是,一旦您对此处的部分命令有特定疑问,我很乐意为您提供帮助
  • 在第三个中你创建了数组对吗?但我想知道更多关于第三个例子的正则表达式部分
  • 是的,它是 vimscript 中的一个列表,而不是一个数组,但对于这个例子,它是一样的。我已将解释放在答案中。
【解决方案2】:

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

如果我用不同的词替换“10”的每个实例,我可能会手动进行一些操作:

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

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

【讨论】:

  • 这会在我的情况下引发错误并显示“E486: Pattern not found: 10cw:
  • @rcShahi 那是因为它的意思是/10&lt;CR&gt;cw。这很容易忘记,因为对于 vimuser 来说,您正在搜索 10
猜你喜欢
  • 2014-11-08
  • 2022-07-05
  • 2011-03-05
  • 2012-07-22
  • 2015-11-07
  • 2015-04-27
  • 2016-09-11
  • 1970-01-01
  • 2021-11-07
相关资源
最近更新 更多