用vim替换,带有特殊字符

问题描述 投票:1回答:4

我试图在vim中使用替换命令来包含特定模式的所有出现

\cite{author1}
\cite{author2}

(\cite{author1})
(\cite{author2})

根据堆栈交换中的其他答案,我使用了以下vim命令

%s/\\cite{(\w\+)}/(\\cite{\1})/g

但是,没有运气。它说“找不到匹配”。我把两个反斜杠,其中一个应该是转义字符。请帮助。

我知道我可以使用其他编辑器完成工作,但我想知道我的错误。谢谢。

vim substitution
4个回答
4
投票

请逃离()

%s/\\cite{\(\w\+\)}/(\\cite{\1})/g

3
投票

作为mentioned,通常你需要逃避括号。

你可以使用very magic mode\v)来使正则表达式更简单;消除了逃避大量正则表达式部分的需要,包括用于捕获的括号:

%s/\v(\\cite\{\w+\})/(\1)/g

3
投票

您不需要捕获组来获得整个匹配。您可以在替换的替换部分中使用\0&进行整场比赛。

:%s/\\cite{\w\+}/(&)/g

如果您确实想使用捕获组,则需要转义捕获组/括号。

:%s/\(foo\)/(\1)/g

有关更多帮助请参阅:

:h :s%
:h /magic

0
投票

知道正则表达式中的每个符号在vim中的作用有时非常困难,尤其是对于所依赖的所有模式和配置变量。出于这个原因,在制作正则表达式时,在任何时刻获得关于我们真正匹配的文本的视觉反馈是非常重要的。

如果您使用neovim,则会有一个名为“inccommand”的特殊选项,您可以启用它来实时预览匹配和替换。这样你就可以更快地找出错误。此功能很可能在将来也包含在vim中,但与此无关,如果激活“incsearch”选项,您还可以使用简单的vim为您提供视觉反馈。

通过'incsearch'设置,您可以观看/和?的匹配而你写它们只是为了确保模式是正确的。稍后您可以从替换中爆炸出一个很好的功能:如果您将第一个部分留空,则将使用最后一个搜索。

所以你可以先进行搜索:

/\\cite{\w\+}/(&)/g

同时,vim会在视觉上向您显示匹配的文本。一旦确定模式正确,请按Enter键,最后键入:

:%s//(\1)<Enter>

此外,如果你想要比这个简单的黑客更强大的东西,你可以去我的插件Extend.vim,它可以通过一个很好的视觉反馈做更多。

© www.soinside.com 2019 - 2024. All rights reserved.