ubuntuusers.de

Bestimmten Textbereich aus einer HTML-Datei herausfiltern/ausschneiden

Status: Ungelöst | Ubuntu-Version: Ubuntu 18.04 (Bionic Beaver)
Antworten |

Datax

Anmeldungsdatum:
29. März 2019

Beiträge: 5

Hallo Linux-Shell-Experten,

ich brauche einmal Eure Hilfe bei einem Vorhaben auf der Shell.

Ich möchte aus einer HTML-Datei einen bestimmten Teil herausfiltern und diesen Teil dann in eine neue HTML-Datei schreiben.

Der betreffende Textbereich beginnt mit <span style="font-size: x-large; font-weight: bold;"> und endet mit </span></p>.

Das letztgenannte Tag (</span></p>) kommt in dem betreffenden Textbereich jedoch mehrmals vor, weshalb nicht das erste Vorkommen das Ende des Bereiches entspricht.

Das Script, das den Textbereich herausfiltern soll, soll also den Bereich von <span style="font-size: x-large; font-weight: bold;"> bis zum letzten Vorkommen des Tags </span></p> "markieren" (ich nenne es einfach mal so) und dann in eine neue Datei schreiben.

Hat jemand von Euch schon mal sowas in der Richtung gemacht bzw. kann mir da hilfreiche Tipps für geben wie man das auf der Shell in Form eines Scrips lösen könnte?

Bin was Shell-Programmierung betrifft und recht wenig erfahren, freue mich über jede Hilfestellung.

MfG, Datax

dingsbums

Anmeldungsdatum:
13. November 2010

Beiträge: 3790

Unter der Annahme, daß die Datei nicht mehr als $maxzeilen Zeilen umfaßt (ansonsten Variable anpassen), wäre das so abbildbar:

1
2
3
4
5
datei="/pfad/zur/datei"
starttext='<span style="font-size: x-large; font-weight: bold;">'
endtext='</span></p>'
maxzeilen=10000
grep "$endtext" "$datei" -B $maxzeilen | grep "$starttext" -A $maxzeilen

Suche das letzte Vorkommen von $endtext, nimm diese Zeile und die $maxzeilen davor (also bis zum Dateianfang), suche in diesem Text das erste Vorkommen von $starttext, nimm diese Zeile und die $maxzeilen danach (also bis zum Ende des ersten Suchergebnisses).

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13213

Die richtigen Werkzeuge für so etwas sind hxnormalize und hxselect aus dem Paket html-xml-utils.

Datax

(Themenstarter)

Anmeldungsdatum:
29. März 2019

Beiträge: 5

Danke Euch schon mal für Eure Rückmeldungen.

Ich denke damit komme ich erstmal weiter.

Werde mich bei Zeit nochmal melden, ob es geklappt hat.

Wie gesagt, besten Dank erstmal 😊 .

MfG, Datax

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Oder so:

1
2
last=$(grep -n '<\/tr>' tab.html | tail -n 1 | sed 's/:.*//'); echo $last
sed -n '/<tr font="phantasy">/, '${last}p tab.html

Grep mit -n spuckt Zeilennummern aus. Tail -n1 nimmt die letzte Zeile, also höchste Zeilennummer. Sed schneidet die Fundstelle hinter der Zeilnnummer ab - womöglich auch mit einem Grepschalter möglich. Der zweite Sedbefehl gibt dann vom ersten Pattern bis zur Zeilennummer aus.

Mit anderer Beispieldatei und anderen Tags (weil gerade zur Hand):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
cat tab.html 
<table>
  <tr font="phantasy">
    <td>BestimmtesSchlüsselwort</td>
    <td>gesuchterInhalt</td>
  </tr>
  <tr>
    <td>abc</td>
    <td>123</td>
  </tr>
  <tr>
    <td>aaa</td>
    <td>111</td>
  </tr>
  <tr>
    <td>bbb</td>
    <td>222</td>
  </tr>
</table>

Ergebnis:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
  <tr font="phantasy">
    <td>BestimmtesSchlüsselwort</td>
    <td>gesuchterInhalt</td>
  </tr>
  <tr>
    <td>abc</td>
    <td>123</td>
  </tr>
  <tr>
    <td>aaa</td>
    <td>111</td>
  </tr>
  <tr>
    <td>bbb</td>
    <td>222</td>
  </tr>
Antworten |