Dateien mit sed bearbeiten

moonwalker99

Lt. Commander
Registriert
Jan. 2008
Beiträge
1.976
Ich möchte bei vielen html-Dateien den gesamten Inhalt zwischen <style> und </style>, der sich aber über viele Zeilen erstreckt, löschen. Mit regulären Ausdrücken habe ich schon etwas Erfahrung, hier bin ich aber überfragt. Was ist, wenn innerhalb der Dateien mehrere <style>...</style> Ausdrücke stehen? Ich möchte den anderen Inhalt nicht verlieren.
 
Im Grunde musst Du einen Ausdruck schaffen, der folgende Bedinungen sucht:
Code:
<style>'kein, 1 oder mehrere Zeichen'</style>
was bei sed ein Punkt ist (.)
und durch folgendes ersetzt:
Code:
<style></style>
Das sollte genügen. Die Schwierigkeit in der Praxis solcher Szenarien ist aber, die Steuerzeichen vor der bash zu verstecken bzw. zu escapen!
 
Das Problem ist eher, eine unbestimmte Anzahl von Zeilenumbrüchen mit zu berücksichtigen.
 
sed kann zwar auch mehrzeilig (sed -n '1h; 1!H; ${ g; s/bla/blubb/g; p}') kann aber nur greedy matchen, würde also in deinem Fall vom allerersten <style> bis zum allerletzten </style> genau einen großen Match erzielen und alles dazwischen entfernen, was du nicht haben willst - zumindest wenn du bequem mit sowas wie .* zwischen den 2 Tags arbeiten möchtest.

Ich empfehle perl. Da kann man mit ".*?" non greedy, also möglichst kurz suchen und ersetzen:

perl -p0777 -e 's|(<style>).*?(</style>)|$1$2|gis' file.html

bzw. gleich (ohne Backups) für alle Files in einem Rutsch
perl -p0777 -e 's|(<style>).*?(</style>)|$1$2|gis' -i *.html
 
Zuletzt bearbeitet:
kann auch nur von sed abraten, ein vergessenes zeichen kann einem da schon mal eine stunde nervern kosten :'(
 
Man kann das mit sed auch machen. Das mit dem Multiline-Replace ist Standardtechnik bei sed. Man muss halt nur den Fakt umgehen, dass sed greedy ist, also

Code:
sed -n '1h;1!H;${g;s?<s>[^<s>]*</s>??g;p}'
.
 
Zurück
Oben