正则表达式在VI中搜索和替换

kte*_*tec 3 regex vim

我有一个包含大量<swf ...> ..... </ swf>的文档.我想删除所有这些.我键入时使用vi

:%s/\<swf[^\/swf>]+\/swf\>//g
Run Code Online (Sandbox Code Playgroud)

我希望这会起作用,但它与任何东西都不相符.

Mat*_*iva 8

您可以使用以下命令从缓冲区中删除所有这些:

:%s!<swf.\{-}/swf>!!
Run Code Online (Sandbox Code Playgroud)

如果您还有可能在两行上分割的标记,则可以添加\_修饰符以使.匹配换行符:

:%s!<swf\_.\{-}/swf>!!
Run Code Online (Sandbox Code Playgroud)

假设您想要删除标签及其包含的内容,如果您只想删除标签并保留内容

:%s!</\?swf.\{-}>!!
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 你不需要逃避<>
  • 你可以选择你想要的任何模式分隔符:Vim将使用你s在替换命令之后放置的第一个字符:这消除了在模式中转义正斜杠的需要

编辑:在你的评论后扩展我的答案

  • 这和/ STRING/REPLACE/g完全一样,我只使用了一个!而不是/这样,我不必引用模式中的反斜杠(参见上面的第二点)
  • 我没有添加g在最后修改,因为我有:set gdefault我的.vimrc,因为永远(这意味着在默认情况下,Vim会替代所有比赛在一条线上,而不是仅仅是第一,所以恢复的意思/g)
  • \{-}*量词的"ungreedy"版本,即它匹配前面原子的0或更多但是尽可能少 - 这有助于确保您的搜索模式将扩展到第一个"结束标记"而不是最后一个.

HTH