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

时间:2010-02-02 18:24:31

标签: regex vim

我有一份包含大量< swf ...> .....< / swf>的文档在里面。我想删除所有这些。我输入时使用vi

:%s/\<swf[^\/swf>]+\/swf\>//g

我希望这会起作用,但它与任何东西都不匹配。

2 个答案:

答案 0 :(得分:8)

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

:%s!<swf.\{-}/swf>!!

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

:%s!<swf\_.\{-}/swf>!!

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

:%s!</\?swf.\{-}>!!

注意:

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

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

  • 这与/ STRING / REPLACE / g完全相同,我只使用!代替/,因此我不必引用模式中的反斜杠(请参阅上面的第二点)
  • 我最后没有添加g修饰符,因为我:set gdefault永远存在.vimrc(这意味着默认情况下,Vim会替换一行中的所有匹配项只是第一个,因此恢复了/g
  • 的含义
  • \{-}*量词的“ungreedy”版本,即它匹配前面原子中的0个或更多但是尽可能少 - 这有助于确保您的搜索模式将扩展到第一个“结束标记”而不是最后一个。

HTH

答案 1 :(得分:3)

这里的问题是[]是一个字符类,所以你要告诉它在swf开始和结束标记之间,字母sw和{{1不能以任何顺序出现在任何地方。

您可以尝试非贪婪的比赛:

f

请注意,\<swf.\{-}\/swf\> 默认情况下不允许换行。

我不使用Vim,所以我用guide来发现语法。我希望这是正确的。