On Tue 04 Nov 2008, Andre Tann wrote:
Es soll ein html-Code umgestriegelt werden. Der sieht so aus:
<wieder was...>
<tr>
<was wichtiges in vielen Zeilen>
<tr>
<blabla>
<wieder was...>
Wie kann man alles vor dem ersten <tr> und alles nach dem letzten
<tr> rausschneiden?
Also, ich glaube nicht, daß Du wirklich willst, wonach Du hier fragst,
denn
1) eine Tabellenzeile beginnt zwar mit
, endet aber mit </tr>.
2) tr kann groß und klein geschrieben sein.
3) man darf in HTML Tabellen verschachteln, also
<table><tr><td><table>...</table></td></tr></table>
4) öffnendes <tr> und schließendes </tr> dürfen auf der selben Zeile
stehen.
Aber trotzdem, eine kurze Lösung in Perl:
perl -e 'undef $/; $_=<>; s/\A.*?(<tr>)/$1/is; s/(<tr>)((?!<tr>).)*?
\z/$1/is; print' input_file
Das Ding kannst Du auch als Filter benutzen, also command | perl ...
Dabei liest Perl das gesamte File erstmal ein, schneidet dann vorn und
hinten ab, so wie Du es wolltest, und schreibt den Rest nach stdout.
Dein File sollte daher nicht wesentlich größer als Dein RAM sein.
Beispiel:
echo -e 'huhu\n<tr>\nblub\nblub\n</tr>\nnochwas\n<TR>\nblub\nblub\n</TR>\nund
schluss' | perl -e 'undef $/; $_=<>; s/\A.*?(<tr>)/$1/is; s/(<tr>)
((?!<tr>).)*\z/$1/is; print'
<tr>
blub
blub
</tr>
nochwas
<TR>
Falls Du doch lieber zeilenweise arbeiten willst, könnte Dich das hier
interessieren:
perl -ne 'print if /