[gelöst] Mit sed über mehrere Zeilen hinweg editieren

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Krull
Beiträge: 190
Registriert: 14.09.2012 10:33:54
Lizenz eigener Beiträge: MIT Lizenz

[gelöst] Mit sed über mehrere Zeilen hinweg editieren

Beitrag von Krull » 30.01.2016 11:13:14

Hallo,

ich habe ein Verzeichnis mit einer Menge HTML-Dateien, aus denen ich gerne alle Javascriptblöcke ausschneiden bzw. löschen möchte. Davon gibt es typischerweise mehrere in jeder Datei und sie verteilen sich auch noch über mehrere Zeilen. Und das bekomme ich mit sed noch nicht so richtig hin. Behelfsmäßig habe ich es so versucht, dass ich das \n am Zeilenende temporär durch ein anderes Sonderzeichen ersetzt habe, sodass alles in einer Zeile stand. Wenn ich dann sowas hier z.B. versucht habe:

Code: Alles auswählen

's/<script .*<\/script>/g'
wird alles vom allerersten <script> bis zum allerletzten </script>-Tag in der Datei gelöscht. Damit entferne ich aber natürlich auch viel Nichtjavascriptkram. Vielleicht kann mir ja jemand verraten, wie man's richtig macht ;)
Zuletzt geändert von Krull am 31.01.2016 21:07:29, insgesamt 1-mal geändert.

tobo
Beiträge: 2339
Registriert: 10.12.2008 10:51:41

Re: Mit sed über mehrere Zeilen hinweg editieren

Beitrag von tobo » 30.01.2016 16:22:11

Non-greedy und über Zeilengrenzen hiweg - das ist eigentlich nicht das, wofür sed angedacht ist!? Die gierige Auswertung (das, woran es jetzt bei dir scheitert) könntest Du aber ebenfalls durch eine Ersetzung lösen, welche nicht in der Datei vorkommt. Also genauso wie beim Zeilenumbruch:

Code: Alles auswählen

's#</script>#´#g;s#<script>[^´]*´##g'
EDIT:
Alternativ mit vorhandenen Zeilenümbrüchen (Änderung am Original !):

Code: Alles auswählen

sed -ni 's#</script>#´#g;1h;1!H;${;g;s#<script>[^´]*´##g;p;}' file.html
"Falls" da eine Schachtelung der Blöcke möglich ist, dann wird das natürlich alles so nicht funktionieren.

EDIT2:
Falls geschachtelt werden kann und ist, dann muss man <script> auch ersetzen und ebenfalls einfach ausschließen. Das dann entweder rekursiv oder mehrfach durchlaufen lassen...

Krull
Beiträge: 190
Registriert: 14.09.2012 10:33:54
Lizenz eigener Beiträge: MIT Lizenz

Re: Mit sed über mehrere Zeilen hinweg editieren

Beitrag von Krull » 31.01.2016 20:54:35

Ah, danke! Habe die erste Variante probiert und damit geht's auch. Mittlerweile habe ich rausgefunden, dass es mit Perl sogar noch nen Tick eleganter funktioniert. Nichtgreedy kann man dann mit *? machen. In diesem Fall also

Code: Alles auswählen

perl -pe 's#<script\s(.*?)</script>##g'

Antworten