AW: ** SPAM scored: Low **Anwendungsfall für sed: ein Muster suchen, um die vorhergehende Zeile zu ändern

ralf.roethemeier at atos.net ralf.roethemeier at atos.net
Mo Jul 11 10:03:45 CEST 2011


Da bedanke ich mich doch recht fein und wünsche eine arbeitsruhige Woche

Ralf


-----Ursprüngliche Nachricht-----
Von: lugrav-bounces at lug-owl.de [mailto:lugrav-bounces at lug-owl.de] Im Auftrag von Peter Voigt
Gesendet: Freitag, 8. Juli 2011 18:09
An: lugrav at lug-owl.de
Betreff: ** SPAM scored: Low **Anwendungsfall für sed: ein Muster suchen, um die vorhergehende Zeile zu ändern


Hallo,

gestern tauchte in der Lugrav die Frage auf, ob es mittels sed möglich ist, eine
Zeile zu ändern, falls die *folgende* Zeile ein bestimmtes Suchmuster aufweist.

Ad hoc vorgeschlagen wurden Lösungen mittels tac, grep, awk und ed.


Mit sed läßt sich das Problem mit dem geringsten Aufwand an Rechenzeit lösen 
unter Ausnutzung eines Features, welches als Holdspace bezeichnet wird:


   sed -n '/muster_danach/{G;/muster_darin/s/alt_text/neu_text/p;};h' eingabedatei


Dieser Befehl ersetzt den Ausdruck 'alt_text' durch den Ausdruck 'neu_text', 

   genau dann, falls die folgende Zeile das Suchmuster '/muster_folgezeile/' 

   und falls die betroffene Zeile das Suchmuster '/muster_darin/' enthält.


Das Suchmuster '/muster_darin/' kann fortfallen, wenn man es nicht braucht.


Zur Erläuterung: Bei dem Holdspace handelt sich um einen simplen Zwischen-
speicher, der mit dem Befehl 'h' beschrieben und dem Befehl 'G' gelesen
wird.


Der Einzeiler unterscheidet zwei Fälle:

(1) Zunächst schaut sed, ob die gerade zu verarbeitende Zeile das Suchmuster 
/muster_danach/ enthält. Falls nein, überspringt sed die Klammerung und geht 
direkt zum Befehl 'h', um die aktuelle Zeile im Zwischenspeicher abzulegen.

(2) Falls die aktuelle Zeile das Suchmuster doch enthält, verarbeitet sed
die Befehle innerhalb der Klammern. Zuerst ruft sed mittels 'G' die zuletzt 
abgespeicherte Zeile wieder auf. Danach führt sed eine ganz normale Sub-
stitution mittels 's' durch, dessen Ergebnis dann ausgedruckt wird. Nach 
dem Abarbeiten der Befehle in der Klammer geht es hinter der Klammer weiter, 
d.h. mittels 'h' wird die aktuelle Zeile in den Zwischenspeicher geschoben. 


Zusammengefaßt: Jede Zeile kommt in den Zwischenspeicher, egal ob sie das
Suchmuster enthält oder nicht. Wenn das Suchmuster in der Zeile  auftaucht, 
wird zusätzlich die vorhergehende Zeile aus dem Zwischenspeicher zurückgeholt, 
wie gewünscht verändert und ausgegeben.


Die Klammerung mit dem vorangehenden Suchmuster wirkt wie eine If-then-Klausel. 

In der Klammer werden nur solche Zeilen aus der Eingabedatei verarbeitet, die 
das voranstehende Suchmuster erfüllen. Hinter der schliessenden Klammer hat 
dieses Suchmuster keine Bedeutung mehr. Weil dem 'h' keine Suchmaske voran-
steht, wird das 'h' auf jede Zeile der Eingabedatei angewendet.

Das letzte ';' vor der schliessenden Klammer ist aus syntaktischen Gründen 
notwendig, sonst kommt es zur Fehlermeldung.  


Anmerkung: Ich habe den Einzeiler unter der BSD-Variante von sed getestet, 
die Linux-Variante sollte ebenso funktionieren ;) 

pv



 
-- 
Lugrav mailing list
Lugrav at lug-owl.de
http://lug-owl.de/mailman/listinfo/lugrav

__________________________________________________________________________________________________________________________________________
Atos Origin GmbH, Theodor-Althoff-Straße 47, D-45133 Essen, Postfach 100 123, D-45001 Essen
Telefon: +49 201 4305 0, Fax: +49 201 4305 689095, www.atosorigin.de
ING Bank AG, Frankfurt/Main: Konto 001 014 0937, BLZ 500 210 00, Swift / BIC INGBDEFF, IBAN DE74 5002 1000 0010 1409 37
Geschäftsführer: Winfried Holz, Vorsitzender des Aufsichtsrats: Peter Hollfelder, Handelsregister Essen HRB 19354, Ust.-ID.-Nr.: DE147861238
__________________________________________________________________________________________________________________________________________




Mehr Informationen über die Mailingliste Lugrav