Awk - разделить html файл из комментариев - PullRequest
2 голосов
/ 23 декабря 2011

У меня есть 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

Но это не работает должным образом.

Есть какие-нибудь мысли о том, как это исправить, или какой-нибудь альтернативный метод, который бы помог?

Ответы [ 2 ]

1 голос
/ 23 декабря 2011
$ 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 (отступ не верен)!

1 голос
/ 23 декабря 2011

Хотя мне не совсем понятен вопрос. Но если у вас есть конкретные комментарии, вы можете указать диапазон регулярных выражений. Часть 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 -->
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...