我有一份包含大量< swf ...> .....< / swf>的文档在里面。我想删除所有这些。我输入时使用vi
:%s/\<swf[^\/swf>]+\/swf\>//g
我希望这会起作用,但它与任何东西都不匹配。
答案 0 :(得分:8)
您可以使用以下命令从缓冲区中删除所有这些:
:%s!<swf.\{-}/swf>!!
如果您还有可能分为两行的标记,则可以添加\_
修饰符,以使.
匹配换行符:
:%s!<swf\_.\{-}/swf>!!
这假设您要删除标记及其包含的内容,如果您只想删除标记并保留内容
:%s!</\?swf.\{-}>!!
注意:
<
或>
s
之后放置的第一个字符:这消除了在模式中转义正斜杠的需要编辑:在你的评论后扩展我的答案
!
代替/
,因此我不必引用模式中的反斜杠(请参阅上面的第二点) g
修饰符,因为我:set gdefault
永远存在.vimrc
(这意味着默认情况下,Vim会替换一行中的所有匹配项只是第一个,因此恢复了/g
)\{-}
是*
量词的“ungreedy”版本,即它匹配前面原子中的0个或更多但是尽可能少 - 这有助于确保您的搜索模式将扩展到第一个“结束标记”而不是最后一个。HTH
答案 1 :(得分:3)
这里的问题是[]
是一个字符类,所以你要告诉它在swf开始和结束标记之间,字母s
,w
和{{1不能以任何顺序出现在任何地方。
您可以尝试非贪婪的比赛:
f
请注意,\<swf.\{-}\/swf\>
默认情况下不允许换行。
我不使用Vim,所以我用guide来发现语法。我希望这是正确的。