2009-11-12 177 views
7

如何删除XML中的注释?Vim - 删除XML注释

如果开始和结束评论标签在同一行上,我使用:g/^<!--.*-->$/d删除评论。如何删除分布在多行的评论?

回答

17

\_.代替.可以匹配所有的字符,包括换行符。但仅此一点就会导致正则表达式引擎出现问题,因为默认情况下正则表达式是贪婪的。使用\{-}代替*进行非贪婪匹配。

由于g/ /d命令仅删除一行(即使是多行匹配),因此最好切换到s///g(全局替代)。

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

+0

这很好用!谢谢! – 2009-11-12 14:50:31

2

您应该使用XSLT将文件转换为新文件。您使用附加规则的身份转换不复制评论。

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*"/> 
    <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="comment()"/> 

你可以在包的libxslt使用“xsltproc的”在Linux上做到这一点作为一个脚本,我想你可以从VIM执行。

0

我认为这应该工作:

:g/<!--.*?-->/d 

问号使得星号“懒”,而不是“贪婪”,这意味着它将尽可能少的匹配,以满足表达。这防止了从表达除去本实施例的中间部分:

We want to keep this<!-- This is a comment -->We also want to keep this<!-- Another comment --> 

编辑:看起来正则表达式的VIM味道不支持*?懒惰匹配。我的错。

+0

怎么样多行? – ghostdog74 2009-11-12 14:42:28

0

如果它没有太多的麻烦,你有你的系统gawk。你可以试试这个

$ more file 
<!-- 
asdlfj 
sdjf 
;jsgsdgjasl --> 
text i want 
i want 
.... 
<!-- junk junk --> 
i want text 
anthor text 
end 

$ gawk -vRS='-->' '{ gsub(/<!--.*/,"")}1' file 


text i want 
i want 
.... 


i want text 
anthor text 
end 
+0

你能解释一下gsub()调用结束时的“1”吗? – 2009-11-12 14:50:00

+0

你可以写另一种方式:gawk -vRS =' - >''{gsub(/

+0

da>确实有效。你能告诉如何通过文件重复这一点吗? – 2009-11-12 15:07:34

+0

@Vijay,对不起,伙计我不知道。您可能必须使用建议的原始正则表达式。 – 2009-11-12 17:33:52