2011-12-23 5 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 --> 

내가, foo.html 파일에 html 파일을 분할에서는 foo2을하려고 해요. html 및 bar.html. 블록 주석 수를 알 수 없습니다. 블록 이름으로. 지금까지 나는이 AWK 라인을

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

을하지만 제대로 작동하지 않습니다.

이 문제를 해결하는 방법이나 도움이되는 다른 방법에 대한 의견이 있으십니까?

+2

그리고 foo2.html이 발생해야합니까? 그리고 왜 이것을하기 위해 awk를 사용하고 있습니까? –

+0

죄송합니다. foo2.html도 분할해야합니다. 사실 awk이 일을 할 수 있다고 생각했습니다. –

+0

그러면 foo2.html을 별도의 foo2.html 파일로 분할해야합니다. 이 세부 사항을 추가하려면 질문을 업데이트해야합니다. –

답변

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 

테스트 : 나는 debug msg을 추가 한

[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을 모른다. 그래서 나는// –

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> 

. print ">>>", $3을 삭제하면 코드가 매우 짧아집니다.

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

마지막으로 html (들여 쓰기가 잘못됨)을 다시 포맷해야합니다!

+0

을 사용했다. OP가 원하는 것. –