ubuntuusers.de

sed von bis Textabschnitt extrahieren

Status: Gelöst | Ubuntu-Version: Ubuntu 11.04 (Natty Narwhal)
Antworten |

bongobong

Avatar von bongobong

Anmeldungsdatum:
12. Dezember 2008

Beiträge: 1820

Wohnort: Hamburg

Hallo,

ich würde gerne mit SED oder einem ähnlichen Tool aus einer HTML-Datei eine Tabelle extrahieren und in eine andere Datei speichern, also von "<table" bis "/table".

Leider konnte ich auf die schnelle nur finden, wie man einen Definierten Bereich entfernt, nicht aber in einer anderen Datei speichert.

Kann mir da jemand weiterhelfen?

Danke

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

... ich nehme für Abschnitte immer awk, der hat das übersichtlich drin

awk '/<table/,/\/table>/  { print $0; }'  meineHtml.html

ggf. willst du den Text in der Zeile vor '<table ...>' - falls es ihn geben sollte - noch abschneiden? ... oder den hinter '</table>' auch?

casati

Anmeldungsdatum:
26. November 2010

Beiträge: 296

Wohnort: Regensburg (Umland)

Funktioniert Umlenkung von STDOUT nicht - bzw. bringt nicht das von Dir gewünschte Ergebnis?

Beste Grüße

bongobong

(Themenstarter)
Avatar von bongobong

Anmeldungsdatum:
12. Dezember 2008

Beiträge: 1820

Wohnort: Hamburg

awk '/<table/,/\/table>/ { print $0; }' meineHtml.html

Danke, macht genau was ich will (wenn man Befehl in neue Datei leitet [>])

ggf. willst du den Text in der Zeile vor '<table ...>' - falls es ihn geben sollte - noch abschneiden? ... oder den hinter '</table>' auch?

In dem Fall glücklicherweise nicht nötig, wäre aber auch interessant wie xD. Aus dem Text muss ich allerdings noch den Bereich zwischen dem 1. <span blablup /span> entfernen. Da bin ich gerade noch am Suchen wie ich das mache, dass nicht alle "span" gelöscht werden.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Mit sed -n (no printing by default) wird die Ausgabe von allem unterdrückt:

1
sed -n '/<table/,/\/table>/p' xy.html

..., nur von <table bis /table wird dann doch gePrinted. Umleitung in Datei wie bei AWK.

bongobong

(Themenstarter)
Avatar von bongobong

Anmeldungsdatum:
12. Dezember 2008

Beiträge: 1820

Wohnort: Hamburg

user unknown schrieb:

Mit sed -n (no printing by default) wird die Ausgabe von allem unterdrückt:

1
sed -n '/<table/,/\/table>/p' xy.html

..., nur von <table bis /table wird dann doch gePrinted. Umleitung in Datei wie bei AWK.

Das ist natürlich sicherer, falls doch mal was hinter /table> stehen sollte.

bongobong

(Themenstarter)
Avatar von bongobong

Anmeldungsdatum:
12. Dezember 2008

Beiträge: 1820

Wohnort: Hamburg

Das mit dem umwandeln ist gar nicht so einfach, zuerst suche ich dos2unix und unix2dos von sysutils aber das gibt es wohl nicht mehr. flip mein die Datei wäre eine Binärdatei und ignoriert sie. Aber ich habe es geschafft mit dem Tool recode, das hier fand ich ganz nett: JuergenF schrieb:

Als Bash-Alias gehts auch:

alias dos2unix='recode ibmpc..lat1'
alias unix2dos='recode lat1..ibmpc'

Jedenfalls sieht es nun so aus:

##Tabelle extrahieren
sed -n '/<table/,/\/table>/p' FILHP473.htm > FILHP473.htm_table

#In UNIX umwandeln
recode ibmpc..lat1 FILHP473.htm_table

#das ersten Span-Ende um ein NEUNL erweitern
sed -e "0,/<\/span>/s//<\/span>NEUNL/" FILHP473.htm_table > neu

#alle (Unix!)Zeilenumbrüche durch ALTNL ersetzen
sed ':a;N;$!ba;s/\n/ALTNL/g' FILHP473.htm_table > temp

#den gewünschten snap-Tag entfernen
sed -e "0,/<span.*\/span>/s///" temp > temp2

# "ALTNL" wieder in Zeilenumbrüche umwandeln
sed -e "s/ALTNL/\n/g" temp2 > FILHP473.htm_table

Werde ich natürlich noch optimieren, sed-Befehle verketten usw. aber es funktioniert.

Danke an alle !!!

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Vielleicht doch mal ein paar Bemerkungen dazu:

  1. So eine HTML-Seite ist der Sache nach ja ein XML-Dokument, und dabei sind zeilenorientierte Tools einfach denkbar ungeeignet.
    (Du siehst ja selbst, welche Verrenkungen Du machen musst, und ganz fehlerfrei kommt die Tabelle hinterher immer noch nicht heraus)
    Nimm besser xmlstarlet (→ http://xmlstar.sourceforge.net/doc/UG/xmlstarlet-ug.html ) oder xpath, das arbeitet sauber nach Tags und nicht nach Zeilen.

  2. Die Win..-Zeilenenden wirst Du auch mit einem einfachen sed 's/\r//' los. Dafür brauchst Du wirklich nicht recode installieren.
    (falls du tatsächlich den Zeichensatz ändern willst, ist iconv dafür bereits installiert. Wenn Du dos2unix suchst, findest Du es über die Paketverwaltung)

Beispiele, wie man xmlstarlet und xpath verwenden kann, findest Du im Forum z.B. hier, hier und hier.
Vielleicht liefere ich später noch einen konkreten Vorschlag für Deine Tabelle nach. (ich weiß noch nicht, ob / wann ich dazu komme)

LG,

track

Edit: Ich sehe gerade auf deinem Parallelthread, dass Du dort in Salamitaktik noch weitere Stückchen wegschneiden willst.
Kannst Du denn nicht einmal verraten, was Du am Ende positiv übrig behalten willst ? - dann wird die Sache mit den XML-tools viel einfacher.

bongobong

(Themenstarter)
Avatar von bongobong

Anmeldungsdatum:
12. Dezember 2008

Beiträge: 1820

Wohnort: Hamburg

Das ist kein Parallelthread, der hier war eigentlich fertig, ich hab das letzte nur im falschen geposted xD

Also hier ging es um das ausschneiden, in diesem hier um das ersetzen eines Musters über mehrere Zeilen: http://forum.ubuntuusers.de/topic/sed-bereich-ausschneiden-muster-entfernen/

Antworten |