使用正则表达式删除html注释标签

时间:2010-10-29 20:54:21

标签: regex sed html-parsing

This is how my text (html) file looks like
    <!--
     |                                |
     |  This is a dummy comment       |
     |      please delete me          |
     |         asap                   |
     |                                |
      ________________________________
     | -->

    this is another line 
    in this long dummy html file...
    please do not delete me

我正在尝试使用sed删除评论:

cat file.html | sed 's/.*<!--\(.*\)-->.*//g'

它不起作用:(我做错了什么?

非常感谢你的帮助!

3 个答案:

答案 0 :(得分:11)

patrickmdnet有正确的答案。这是使用扩展正则表达式的一行:

cat file.html | sed -e :a -re 's/<!--.*?-->//g;/<!--/N;//ba'

这是了解有关sed的更多信息。这个sed是单行#92

的改编版

http://www.catonmat.net/blog/sed-one-liners-explained-part-three/

答案 1 :(得分:7)

原始尝试的一个问题是您的正则表达式只处理完全在一行上的注释。此外,前导和尾随“。*”将删除非评论文本。

最好使用现有代码而不是自己编写代码。

http://sed.sourceforge.net/grabbag/scripts/strip_html_comments.sed

#! /bin/sed -f
# Delete HTML comments
# i.e. everything between <!-- and -->
# by Stewart Ravenhall <stewart.ravenhall@ukonline.co.uk>

/<!--/!b
:a
/-->/!{
    N
    ba
}
s/<!--.*-->//

(来自http://sed.sourceforge.net/grabbag/scripts/

有关使用perl模块删除HTML注释的各种方法,请参阅此链接(使用Regexp :: Common,HTML :: Parser或File :: Comments。)我确信有使用其他实用程序的方法。

http://www.perlmonks.org/?node_id=500603

答案 2 :(得分:3)

如果您愿意,我认为您可以使用awk执行此操作。开始:

[~] $ more test.txt
<!--

An HTML style comment 

-->

Some other text

<div>
<p>blah</p>
</div>

<!-- Whoops
     Another comment -->
<span>Something</span>

awk的结果:

[~]$ cat test.txt | awk '/<!--/ {off=1} /-->/ {off=2} /([\s\S]*)/ {if (off==0) print; if (off==2) off=0}'
Some other text

<div>
<p>blah</p>
</div>

<span>Something</span>