在Vim中更换

在Vim中更换,vim,replace,Vim,Replace,如何在替换内部进行替换 我知道您可以将光标下的当前单词放入replace,但我想在将其作为输出之前对其执行replace 例如: 有一份已经通过的文件,并替换您知道的受影响更严重的单词,例如去制度化(提示:美利坚合众国宪法)。该文件还包含一些已正确替换的单词 在整个文档中,将Wooloomoolo中的o更改为0(仅适用于该词) 一个真实世界的例子(来自我的vim历史)正在Latex文档中运行 %s/\\begin{table}\[h\]/\\begin{table}\[H\]/c 在这里,

如何在替换内部进行替换

我知道您可以将光标下的当前单词放入replace,但我想在将其作为输出之前对其执行replace

例如:

  • 有一份已经通过的文件,并替换您知道的受影响更严重的单词,例如去制度化(提示:美利坚合众国宪法)。该文件还包含一些已正确替换的单词
  • 在整个文档中,将Wooloomoolo中的
    o
    更改为
    0
    (仅适用于该词)
一个真实世界的例子(来自我的vim历史)正在Latex文档中运行

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

在这里,我复制字符串只是为了得到一个小的更改。

将o替换为0很简单:

:s/o/0/g
也许您想知道如何将其应用于(视觉)选择

:s/\%Vo/0/g
编辑您想要的内容(参见评论)

:%s/\\ze/\=替换(子匹配(0),'o','0','g')/g
它的作用是:

  • [Wolm]\+
    匹配仅由
    W
    o
    l
    m
  • \
    匹配相同的(独立)单词(因此,Wooloomoolo或
    mooW
    Wlomo
    将全部匹配,但不匹配
    amool
    等)
  • \zs
    标记替换匹配的开始,
    \ze
    标记替换匹配的结束
  • \=替换(子匹配(0),'o','0','g')
    替换匹配(在
    \zs
    \ze
    之间),但替换
    0
    o
你可以从这个模式开始

  • 用实际目标替换
    [Wolm]\+
  • \zs…\ze
    之外添加可选上下文,以便减少匹配
  • 在模式前面添加
    \c
    ,以启用不区分大小写的匹配
在编写
:sub
命令时,尝试键入Ctrl-f。这将打开命令行窗口,并允许您使用vim的正常模式编辑命令。如果在此模式下按Enter键,将执行当前行。如果按Ctrl-c键,将返回到命令行模式,当前行作为当前文本

当您意外地键入
q:
时,也会出现命令行窗口。(我知道我在理解它的用途之前做了很多。它也有您以前的命令的历史记录。在
/
搜索或键入
q/
时也尝试相同的方法。)


另请参见
:help cmdline window

更新的问题以进行澄清。您的建议将替换所有
o
s或仅替换一个实例(除非我弄错了)好的,那么
%s/wooloomoolo/w00l00l00/g
。@Portablejim:我想我想出了很好的提示让你现在就开始,请看更新的答案+分解说明+提示。看看:)没有我希望的那么短/简单,但仍然是一种方法。遇到“具有命令历史记录的命令行窗口”可能也会有所帮助。
:%s/\<\zs[Wolm]\+\>\ze/\=substitute(submatch(0), 'o', '0', 'g')/g