2011-12-23 35 views
2

拆分html文件,我有这样的评论的HTML文件(有些可以被嵌套)awk中 - 从评论

<!-- Begin foo.html --> 
<p>some html code</p> 

    <!-- Begin foo2.html --> 
    <p>some html code</p> 
    <!-- End foo2.html --> 

<!-- End foo.html --> 

<!-- Begin bar.html --> 
<p>some html code</p> 
<!-- End bar.html --> 

我想要做分割html文件到foo.html和Foo2。 html和bar.html。 块注释的数量未知。作为块的名称。 到目前为止,我有这个AWK线

awk '/<!-- Begin (.*?)-->/ {f=$1} f{print > f} /<!-- End \1 -->/{close f; f=""}' index.html 

但它不能正常工作。

关于如何解决这个问题或任何其他方法的帮助?

+2

和whas应该发生在foo2.html?你为什么用awk来做到这一点? – 2011-12-23 04:08:32

+0

对不起,foo2.html也必须拆分。我实际上认为awk可以完成这项工作。 – 2011-12-23 04:23:18

+0

所以你的意思是foo2.html需要在一个单独的foo2.html文件中拆分?您需要更新您的问题以添加此详细信息。 – 2011-12-23 04:38:03

回答

1

虽然我对这个问题不太清楚。但是如果你有具体的评论,那么你可以给出一个正则表达式范围。 foo2.html部分也将附加在foo.html中。事情是这样的 -

awk ' 
/Begin foo.html/,/End foo.html/{print $0 > "foo.html"} 
/Begin bar.html/,/End bar.html/{print $0 > "bar.html"}' index.html 

测试:

[jaypal:~/Temp] cat index.html 
<!-- Begin foo.html --> 
<p>some html code</p> 

    <!-- Begin foo2.html --> 
    <p>some html code</p> 
    <!-- End foo2.html --> 

<!-- End foo.html --> 

<!-- Begin bar.html --> 
<p>some html code</p> 
<!-- End bar.html --> 

[jaypal:~/Temp] awk '/Begin foo.html/,/End foo.html/{print $0 > "foo.html"} 
/Begin bar.html/,/End bar.html/{print $0 > "bar.html"}' index.html 

[jaypal:~/Temp] cat foo.html 
<!-- Begin foo.html --> 
<p>some html code</p> 

    <!-- Begin foo2.html --> 
    <p>some html code</p> 
    <!-- End foo2.html --> 

<!-- End foo.html --> 

[jaypal:~/Temp] cat bar.html 
<!-- Begin bar.html --> 
<p>some html code</p> 
<!-- End bar.html --> 
+0

谢谢,但在我的情况下,我不知道foo.html或foo2.html,这就是为什么我用/ <! - Begin(。*?) - >/ – 2011-12-23 09:19:13

1
$ cat input.txt 
<!-- Begin foo.html --> 
<p>some html code</p> 

    <!-- Begin foo2.html --> 
    <p>some html code</p> 
    <!-- End foo2.html --> 

<!-- End foo.html --> 

<!-- Begin bar.html --> 
<p>some html code</p> 
<!-- End bar.html --> 

$ awk '/<!-- Begin/{stack[sp++]=$3; print ">>>", $3; next}; /<!-- End/{sp--; print "<<<", $3; next}; {if(sp>0) print > stack[sp-1]}' input.txt 
>>> foo.html 
>>> foo2.html 
<<< foo2.html 
<<< foo.html 
>>> bar.html 
<<< bar.html 

$ for i in {foo,foo2,bar}.html; do echo "=====$i======"; cat $i; done 
=====foo.html====== 
<p>some html code</p> 


=====foo2.html====== 
    <p>some html code</p> 
=====bar.html====== 
<p>some html code</p> 

我已经添加debug msg。删除print ">>>", $3后,代码非常短。

$ awk '/<!-- Begin/{stack[sp++]=$3; next}; /<!-- End/{sp--; next}; {if(sp>0) print > stack[sp-1]}' input.txt 

最后,您应该重新格式化html(缩进不正确)!

+0

我认为这是最好的答案OP想要什么。 – 2011-12-23 16:10:11