我有一个包含很多 ..... 的文档。我想删除所有这些。当我输入时使用 vi

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

我希望这会奏效,但它不匹配任何东西。

最佳答案

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

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

如果您还有可能分成两行的标签,您可以添加 \_ 修饰符以使 . 也匹配换行符:
:%s!<swf\_.\{-}/swf>!!

假设您想删除标签及其包含的内容,如果您只想删除标签并保留内容
:%s!</\?swf.\{-}>!!

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

    编辑:在您发表评论后扩展我的答案
  • 这与/STRING/REPLACE/g 完全一样 我只使用了 ! 而不是 / 这样我就不必在模式中引用反斜杠(参见上面我的第二点)
  • 我没有在最后添加 g 修饰符,因为我的 :set gdefault 中一直都有 .vimrc (这意味着默认情况下 Vim 将替换一行中的所有匹配项,而不仅仅是第一个,从而恢复 /g 的含义)
  • \{-}* 量词的“非贪婪”版本,即它匹配 0 个或多个前面的原子,但尽可能少地使用 -- 这有助于确保您的搜索模式将扩展到第一个“结束标记” “而不是最后一个。

  • HTH

    关于VI中的正则表达式搜索和替换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2186554/

    10-12 12:46
    查看更多