在Vim中替换替换内容

3

如何在替换中进行替换?

我知道你可以将光标下的当前单词放入替换中,但我想在输出之前对其进行替换。

例如:

  • 有一个经过 clbuttic 过滤器的文档,并替换那些你知道已经受到恶化影响的单词,例如去机构化(提示:美利坚合众国宪法)。该文件还具有一些正确替换的单词。
  • 在整个文档中将 Wooloomooloo 中的 o 更改为 0 (仅限该单词)

一个真实的例子(来自我的 vim 历史记录)是在 Latex 文档中运行:

%s/\\begin{table}\[h\]/\\begin{table}\[H\]/c

我在复制字符串,只是为了做出微小的更改。

2个回答

2
替换o为0很简单:
:s/o/0/g

也许您想知道如何将它应用于(可视)选择?
:s/\%Vo/0/g

编辑 很可能是您想要的(请参见评论)

:%s/\<\zs[Wolm]\+\>\ze/\=substitute(submatch(0), 'o', '0', 'g')/g

这段代码的作用:

  • [Wolm]\+匹配由Wolm组成的序列
  • \<[Wolm]\+\>匹配相同的(独立的)单词,如Wooloomooloo、mooWWlomo都会匹配,但不包括amool等。
  • \zs标记替换的匹配的开始,\ze标记结束
  • \=substitute(submatch(0), 'o', '0', 'g')将匹配(在\zs\ze之间)替换为将o替换为0

您可以从这个模式开始:

  • 使用您实际的目标替换[Wolm]\+
  • \zs...\ze之外添加可选的上下文,以便减少匹配
  • 在模式前面添加\c以启用大小写不敏感匹配

更新了问题以进行澄清。您的建议将要么替换所有的“o”,要么只替换一个实例(除非我弄错了)。 - Portablejim
好的,所以 %s/Wooloomooloo/W00l00m00l00/g ...? - sehe
@Portablejim:我想我已经想出了相当不错的提示,让你开始工作了,看看更新后的答案+分解说明+技巧。看一下 :) - sehe
虽然不是我所希望的那么简短/简单,但仍有一种方法可以做到。我发现了“带有命令历史记录的命令行窗口”,这可能也会有所帮助。http://vimcasts.org/episodes/refining-search-patterns-with-the-command-line-window/ - Portablejim

0

在编写:sub命令时,尝试同时按下Ctrl-f。这将打开命令行窗口,并允许您使用vim的正常模式编辑命令。如果在此模式下按Enter键,则会执行当前行。如果按下Ctrl-c,则会将当前行作为当前文本返回到命令行模式。

当您意外输入q:时,也会出现命令行窗口。(我知道在理解它的用途之前,我经常这样做。)它还具有先前命令的历史记录。在进行/搜索期间尝试相同操作或键入q/

另请参见:help cmdline-window


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