【问题标题】:Awk - split html file from commentsawk - 从评论中拆分 html 文件
【发布时间】:2012-01-26 13:56:55
【问题描述】:

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

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

但它不能正常工作。

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

【问题讨论】:

  • foo2.html 会发生什么?你为什么要使用 awk 来做这件事?
  • 对不起,foo2.html 也必须拆分。我实际上认为 awk 可以完成这项工作。
  • 所以你的意思是 foo2.html 需要被分割成一个单独的 foo2.html 文件?您需要更新您的问题以添加此详细信息。
  • 我相信你可以用 awk 来做,但它可能不是这项工作的理想工具。考虑使用一种更通用的脚本语言,它与 awk(Python、Perl)一样普遍。

标签: linux bash split awk grep


【解决方案1】:

虽然我对这个问题不太清楚。但是如果你有特定的 cmets,那么你可以给出一个正则表达式范围。 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 -->

【讨论】:

  • 谢谢,但就我而言,我不知道 foo.html 或 foo2.html,这就是我使用 //的原因>
【解决方案2】:
$ 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 "&gt;&gt;&gt;", $3后,代码就很短了。

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

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

【讨论】:

  • 我认为这是 OP 想要的最佳答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
相关资源
最近更新 更多