PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mehrzeiligen text mit Bash...



LSSuper2004
20-08-2005, 16:59
So,

nachdem in einem Konkurrenzforum keiner darauf geantwortet hat, hab ich euer Forum entdeckt und poste mal hier.

Ziel ist es, aus einer Datei mehrzeilige texte herauszulösen. (Es handelt sich um HTML-Dateien, aber es ist ja auchegal.)

In einer Tabelle sind dort mehrere Zellen untereinander angeordnet und ich möchte die texte zwischen den Zeichen <td class="general"> und </td> rauslösen. Das sind oft Mehrzeiler. Außerdem in einer for-Schleife alles durchgehen und beim ersten Durchlauf nur das erste finden, beim zweiten das zweite und so fort. (Das könnte man notfalls so machen, dass man in einer temporären Datei nach jedem Fundstück den ersten Teil herausschneidet, damit dieser nicht mehr gefunden wird,.)

Also aus so nem Ausschnitt



<tr>
<td class="general">
Dies ist ein Text
</td>
</tr>
<tr>
<td class="general">
Windows ist net so gut
</td>
</tr>
<tr>
<td>
Das sollte nicht gefunden werden</td>
</tr><tr>
<td class="general">Linux
ist
S U P E R !!!</td></tr>


bei den drei Durchgängen die Zeilen

Dies ist ein Text

Windows ist net so gut

Linux
ist
S U P E R !!!

gefunden werden. (Die Zahl der Durchgänge sollte variabel sein, aber dasa its kein Problem.)

In einem zweiten Schritt könnte ich dann noch die Zeilenumbrüche filtern, weil ich für ein Skript in eine Datendatei EINE Zeile mit dem Code schreiben muss. (Da sich HTML aber nicht um newline-Zeichen kümmert, kann man diese getrost durch Leerezeichen ersetzn.)

Also kurzum: Texte zwischn <td class="general"> und </td> finden, alle einzeln + Zeilenumbrüche weg. (´Letzteres ist mit SED gut zu erledigen.)

- penma -

peschmae
20-08-2005, 21:46
Also ich würde erst die Zeilenumbrüche wegmachen und dann mit Perl drauf los.

Sed passt leider nicht so gut, da sie RegExps in Sed immer "greedy" sind - d.h. sie matchen z.B. das erste <td> und dann das letzte </td> und nicht das nächste wie du das möchtest - bei Perl kannst du dieses Verhalten afair einstellen.

Wie das dann genau in Perl aussehen würde kann ich dir auch nicht sagen - hab das schon zu lange nicht mehr verwendet. Musst dich halt etwas einlesen :)

Hier
http://www.ebb.org/PickingUpPerl/
gibts z.B. ein Tutorial-Buch zum lesen. k.A. wie gut das ist aber die Inhaltsübersicht sieht schon mal nicht schlecht aus.

Ich glaube in Sed hatte ich vor einiger Zeit auch mal was im Forum gepostet das was in die Richtung tat - zumindest mit HTML-Tags und so. War aber ultramerkwürdig - wie halt sed-Scripts so zu werden pflegen wenns kompliziert wird.

MfG Peschmä

LSSuper2004
21-08-2005, 13:49
Hmm, okay, aber mit Perl hab ich nie programmiert. Wäre aber auch kein Problem, das mit der Bash zu benutzn oder dann alles auf Perl umzustellen. Hauptsache, ich krieg aus einer - das soll der Einsatzzweck sein - HTML-Seite von einem Forum eine datei im folgenden Stil heraus:



Seitentitel (TITLE-Tag), aber ohne Forenname
<<<Beiträge hintereinander>>>
Autor
Erstellt am
HTML-Code (eine Zeile)
<<<Wiederholen für alle Beiträge>>>


Das System, wo diese Einträge herauszulösen sind, ist mir bereits klar. Also muss das Skript die folgenden inträge durch zeilenumbrüche getrennt in eine Dtei schreiben:

Text zwischen <title> und </title> (10 Zeichen vom Anfang aber wegnehmen)
Text nach "von " bis zum nächsten Leerzeichen
text nach "erstellt am " (es folgt ein Datum) sagen wir mal bis zum </td>
Tetx zwischen <td class="general"> und </td> in EINER ZEILE
2.-4. Schritt wiederholen, bis kein Fundstück mehr.

Anschließend (besser als zweites Skript) folgendes mit erzeugter Datei machen:
Gesamtzahl Beiträge zählen (Anzahl nicht leerer Zeilen minus 1, es wird die Titelzeile ausgenommen)
Bestimmten fest eingebauten text an den Output schreiben
Erste Zeile einlesen und n den Output (in bash macht man das gut mit cat << EOF >> textdatei)
weiteren eingebauten Text an den Output
schleife: von 1 bis Gesamtzahl Beiträge
{
Festen Text an Output
Erste Zeile eines Blocks (ein B lock besteht aus Autor, Erstellungsdatum und HTML-Code) an Output
Fester text an den Output
Zweite Zeile vom Block an Output
fester Text
Dritte Zeile
fester Texzt an Output
} (schleife ende)
fester text an output

Weiß nicht, hört sich bestimmt kompliziert an, aber sagen wir mal so etwas in der Datei vom ersten Skript:



Mehrzeiligen text mit Bash...
LsSuper2004
20.08.2005 17:59
So, <br><br>nachdem ich in einem Konkurrenzforum (und so weiter)
peschmae
20.08.2005 22:46
Also ich würde erst die Zeilenumbrüche (...)
LSsuper2004
21.08.2005 14:28
Hmm, okay, aber mit Perl hab ich noch nie programmiert. (...)


Hoffe es wird jetzt klarer, das wäre jetzt das Ergebnis für dieses Forum und diese Beiträge hier. Also so in dem Stil.

- penma -