Seitenanfang

Programmieren mit sed

Dieser Post wurde aus meiner alten WordPress-Installation importiert. Sollte es Darstellungsprobleme, falsche Links oder fehlende Bilder geben, bitte einfach hier einen Kommentar hinterlassen. Danke.


Funktionsnamen sind normalerweise Konstanten: Einmal festgelegt ist es quasi unmöglich sie zu ändern. Wird dies dennoch einmal notwendig können leicht einige Stunden oder Tage Entwicklungszeit notwendig werden.

sed, der Linux-Streameditor, erlaubt die massenweise Änderung von Sourcecode in Sekunden.

Im konkrekten Fall sollte ein ein veraltetes Modul (Old::Misc::error_handler) durch ein neues (MyProject::Errors::error_handler) ersetzt werden, beide haben identische Parameter.

Als erstes müssen alle Aufrufe zu ändernden Aufrufe gefunden werden, grep's -r durchsucht dabei alle Unterverzeichnisse und -l gibt nur die gefundenen Dateinamen aus, der zweite grep filtert die SVN-Hilfsdateien raus:

grep -rl 'Old::Misc::error_handler' |grep -v '\.svn' >affected_list.txt
Damit sind alle anzufassenden Scripte und Module bekannt, jetzt muss zunächst der alte "use" gegen den neuen ausgetauscht werden:
sed -i 's/use Old::Misc/use MyProject::Errors/' `cat affected_list.txt`
Dabei bearbeitet sed jede Datei aus affected_list.txt und ersetzt den alten durch den neuen Modulnamen.

Wird das alte Modul weiterhin benötigt, kann ein neuer "use" hinzugefügt werden:

sed -i 's/\(use Old::Misc;\)/\1\nuse MyProject::Errors;/' `cat affected_list.txt`
Dieser Befehl "merkt" sich die gefundene Stelle zwischen "\(" und "\)" und fügt diese bei der Ersetzung wieder ein "\1", dann folgt ein Zeilenumbruch und der neue "use". Abgeschlossen wird die Zeile automatisch von sed durch den alten Zeilenumbruch.

Bleibt nur noch die Änderung der Funktionsaufrufe selbst:

sed -i 's/Old::Misc::error_handler/MyProject::Errors::error_handler/' `cat affected_list.txt`
Damit ist die Umstellung abgeschlossen.

Bei der Verwendung von sed muss der Perl-Programmierer immer bedenken, dass sed nur POSIX-RegEx und keine Perl-RegEx unterstützt, diese unterscheiden sich teilweise erheblich (z.B. \+ anstatt + oder \( \) anstatt ( ), wobei * allerdings gleich ist).

 

Noch keine Kommentare. Schreib was dazu

Schreib was dazu

Die folgenden HTML-Tags sind erlaubt:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>