Awk - 从注释中拆分 html 文件



我有一个带有这样注释的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 -->

我试图做的是将html文件拆分为foo.html,foo2.html和bar.html。块注释的数量未知。作为块的名称。到目前为止,我有这条尴尬的台词

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

但它不能正常工作。

关于如何解决此问题的任何想法,或任何有帮助的替代方法?

虽然我对这个问题不太清楚。但是如果您有具体的评论,那么您可以给出一个正则表达式范围。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 -->
$ 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(缩进不正确(!

最新更新