On Tue 04 Nov 2008, Andre Tann wrote:
Da ich mich ja vertippt hatte mit dem </tr>, müßte es also heißen:
perl -e 'undef $/; $_=<>; s/\A.*?(<tr>)/$1/is; s/(<tr>)((?!</tr>).)*? \z/$1/is; print' input_file ^ Also nur hier der /
Stimmt das? Ich bin in Perl nicht so fit...
Also ich erklär's ein bissel. Den echo-Befehl kennst Du ja sicher. echo 'huhu <tr> blub blub </tr> nochwas <TR> blub blub </TR> und schluss' | perl -e ' undef $/; # perl soll das gesamte File lesen $_=<>; # lies das File nach $_ s/\A.*?(<tr>)/$1/is; # siehe 1) s/(<\/tr>)((?!<\/tr>).)*\z/$1/is; # siehe 2) print' # gebe $_ aus. 1) Wenn nicht anders angegeben arbeiten reg. Ausdrücke auf der Variablen $_. Deshalb haben wir das File auch in diese gelesen. Das erste "s" bedeutet "ersetzen", ähnlich wie in sed. \A kennzeichnet den Anfang des Strings, matcht aber nicht nach einem \n innerhalb. Von da an wird alles bis zum ersten <tr> gelesen <tr> selbst landet in $1 (wegen der Klammern). Die beiden Buchstaben "is" nach dem letzten / sind Flags. "i" sagt, daß Groß- und Kleinschreibung nicht unterschieden werden. D.h <TR> würde auch passen. Laß es einfach weg, wenn es stört. "s" ist wichtig. Das bedeutet, daß "." auch auf \n paßt. Wenn Du das "?" wegmachen würdest, wäre "*" greedy (gefräßig). D.h. er würde nicht bis zum ersten <tr>, sondern zum letzten fressen. 2) Der Gedanke hier ist folgender, finde ein </tr> und danach bis zum Stringende keine Stelle, an der ein </tr> beginnt. \z bezeichnet das Stringende. (<\/tr>) kannst Du sicher selbst erklären. Bleibt also ((?!<\/tr>).)*. Zuerst die innere Klammer ?! leitet einen negativen Lookahead ein, guckt also, ob an dieser Stelle der angegebene String nicht beginnt. Der Punkt nach der inneren ) frißt ein Zeichen. Die äußere Klammer brauche ich, um den Lookahead und den Punkt zusammenzufassen. Das mit dem Abschneiden ist hier übrigens buchstäblich gemeint. 2) schneidet auch ein abschließendes \n ab. Falls Du das brauchst, benutze "perl -le" statt "perl -e". Torsten -- Need professional mod_perl support? Just hire me: torsten.foertsch@gmx.net -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org