kapituliert *sed* vor zeilenumbrüchen? Wie dann?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
michaa7
Beiträge: 4955
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

kapituliert *sed* vor zeilenumbrüchen? Wie dann?

Beitrag von michaa7 » 24.06.2007 20:50:35

Ich bearbeite *.html dateien mit sed. Dabei sollen bestimmte tags samt attributen gelöscht werden, einige tags sollen ohne attribute erhalten bleiben.

Folgende sed definitionsdatei habe ich mir zusammengebastelt:

Code: Alles auswählen

#Aufrufen mit:
# sed -f Befehlsdatei zu_bearbeitende_Datei.html

#macht  aus <table border="1"> ein einfaches <table> 
s/<table[^>]*>/<table>/g 

#macht aus <tr "blafasel"> ein einfaches <tr> usw.
s/<tr[^>]*>/<tr>/g 
#s/</tr[^>]*>/</tr>/g
s/<td[^>]*>/<td>/g 
#s/</td[^>]*>/</td>/g


#macht aus <p "blafasel"> gar nichts, sondern löscht die Zeichenkette. 
s/<[/]*p[^>]*>//g
s/<br[^>]*>//g
s/<[/]*div[^>]*>//g
s/<[/]*small[^>]*>//g
s/<[/]*span[^>]*>//g
s/<[/]*big[^>]*>//g
s/<[/]*center[^>]*>//g
s/<[/]*head[^>]*>//g
s/<[/]*meta[^>]*>//g
s/<[/]*body[^>]*>//g
s/<[/]*html[^>]*>//g
s/<![^>]*>//g
Ich war zunächst verwundert, dass einig tags nicht gelöscht wurden. Bei näherem hinsehen war diesen gemeinsam, dass sie einen zeilenumbruch beinhalten. Kann ich den oben gezeigten mustern einen zeilenumbruch hinzufügen? Oder wie ließen sich aus allen html dokumenten innerhalb eines verzeichnisses alle zeilenumbrüche entfernen oder durch leerzeichen ersetzen?

Danke für entsprechende hilfe.
Zuletzt geändert von michaa7 am 24.06.2007 21:05:40, insgesamt 1-mal geändert.
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 24.06.2007 21:04:53

Sed arbeitet auf Zeilenbasis. Du kannst aber ein sed or tr vorschalten, dass die Zeilenumbrüche entfernt. In etwa so (ohne Garantie, da ich gerade unter Windows bin)

Code: Alles auswählen

tr "\n" " " < Datei.html | sed -f DEIN_SED_SCRIPT

michaa7
Beiträge: 4955
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von michaa7 » 24.06.2007 21:24:48

Danke, nur so ganz klappt das nicht:

Code: Alles auswählen

$ tr "\n" " " < nam06_m_wuesymp.htm | sed -f sed_def nam06_m_wuesymp.htm > na_m_wuesymp.txt
Habe ich versucht, dennoch bleiben nach wie vor tags mit zeilenumbrüchen unverändert, beispiel:

Code: Alles auswählen

     </td>
    </tr>
    <tr>
      <td> <span
 style="font-weight: bold; text-decoration: underline;">
      </td>
    </tr>
    <tr>
      <td> <span
 style="font-weight: bold; text-decoration: underline;">
      </td>
    </tr>
    <tr>
      <td>
      </td>
    </tr>
Kann man denn nicht irgendwie sichtbarmachen, was da genau steht? Würde das einen unterschied machen, wenn das orginal dokument auf einem windowsrechener erstellt wurde? ( zeilenende, wagenrücklauf, neue zeile )

Jedenfalls half es weder \n, noch \f oder \r zu entfernen, der zeilenumbruch bleibt bestehen. Muß mann da wirklich immer nen hexeditor bemühen, um zeilenumbrüche etc zu finden und zu löschen?
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

Methusalix

kapituliert *sed* vor zeilenumbrüchen? Wie dann?

Beitrag von Methusalix » 24.06.2007 22:45:41

Hallo,
wie Joghurt schon gesagt hat, arbeitet sed auf Zeilenbasis. Wie sich das mit
den Zeilenumbrüchen lösen läßt, weiß ich nicht. Aber mal so auf die Schnelle:

Code: Alles auswählen

matthias@debbi:~/test$ less testdatei.html | sed 's/style[^>]*//g'
 </td>
    </tr>
    <tr>
      <td> <span
 >
      </td>
    </tr>
    <tr>
      <td> <span
 >
      </td>
    </tr>
...
als Ergebnis von Deinem Beispiel. Ist nicht elegant, sieht auch nicht gut aus, funktioniert aber.
Gruß
Matthias

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 24.06.2007 22:52:48

michaa7 hat geschrieben:Danke, nur so ganz klappt das nicht:

Code: Alles auswählen

$ tr "\n" " " < nam06_m_wuesymp.htm | sed -f sed_def nam06_m_wuesymp.htm > na_m_wuesymp.txt
Du darfst bei sed nicht nochmal den Dateinamen angeben, da sed dann aus der Datei liest, du willst aber, dass er von stdin liest:

Code: Alles auswählen

$ tr "\n" " " < nam06_m_wuesymp.htm | sed -f sed_def > na_m_wuesymp.txt
sollte helfen

michaa7
Beiträge: 4955
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von michaa7 » 24.06.2007 23:25:33

Joghurt hat geschrieben: Du darfst bei sed nicht nochmal den Dateinamen angeben, da sed dann aus der Datei liest, du willst aber, dass er von stdin liest:

Code: Alles auswählen

$ tr "\n" " " < nam06_m_wuesymp.htm | sed -f sed_def > na_m_wuesymp.txt
sollte helfen
Ok, so klappt das. Fast perfekt. Das kleine problem: Es werden alle zeilenumbrüche beseitigt, zu not geht das, erhöht aber den weiterverarbeitungsaufwand.

Nun suche ich noch nach einer möglichkeit, nur die zeilenumbrüche mit leerzeichen zu ersetzen, die irgendwie zwischen "< + irgendetwas" und "irgendetwas + >" eingeschlossen sind.

Mit "tr" wird das wohl nichts, mit sed beisse ich mir die zähne aus, mit "geany" könnte ich das, nur ist das dann nicht kommandozeile. Welche möglichkeit gibt es noch?
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

michaa7
Beiträge: 4955
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Re: kapituliert *sed* vor zeilenumbrüchen? Wie dann?

Beitrag von michaa7 » 24.06.2007 23:31:20

Matthias-GE hat geschrieben:H
als Ergebnis von Deinem Beispiel. Ist nicht elegant, sieht auch nicht gut aus, funktioniert aber.
Das ist jetzt mittlerweile schon ehr ein kampf mit der tücke geworden. Mit den kompromissen kann ich eigentlich längst leben ( arbeitstechnisch ), aber nun nerft der ehrgeiz. Und wenn sich das mit geany bewerkstelligen läßt ( das entfernen des LF innerhalb eines tags beliebigen inhalts ), dann wird es doch auch irgendwas in der komandozeile geben.
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

Antworten