HACK #1: Reguläre Ausdrücke in VIM
11:10:33 (+0000)
Haben Sie sich schon mal überlegt, was man mit dem VIM so alles machen kann. Nehmen wir ein kleines Fallbeispiel, um eine Problematik aus der Praxis etwas plastischer darstellen zu können.
Nehmen Sie an, Sie hätten eine C++ Source-Code File mit über 10.000 Zeilen Code. Knapp die Hälfte davon, sollen solche JavaDOC-Kommmentare sein, wie der folgende:
/**
* Escape 5 characters – ‘&’, ‘”‘, ‘>’, ‘< ' and '\'' - to the standard
* XML quotation - "&", """, ">", "<" and "&apros;".
*
* @param char* buf: output variable, perhaps with escaped characters
* @param char* data: text, which should be checked and perhaps corrected
* @param int* len: normally value of strlen(buf), means the start point of appending
* @return 1: successfully done
* @return 0: means (buf==NULL), alloc mem before!!!
* @return -1: means (data==NULL)
*/
Nun ist dem Author der C++ Source-Code Datei aber ein Fehler unterlaufen. Es darf nämlich mehrere @param’s geben, aber nur einen @return, der aber mehrzeilig sein darf! Nun können Sie fast 5000 Zeilen mit der Hand durchgehen und den Fehler korrigieren, oder Sie verwenden REGEX – reguläre Ausdrücke.
Zunächste können Sie sich die Fehler einmal markieren lassen, wenn Sie folgendermaßen in VIM suchen. Voraussetzung ist, dass in der ersten Zeile immer “@return 1: …” steht:
/@return [^1].*:
Hiermit sagen Sie dem improved VI, dass er jeden regulären Ausdruck suchen (‘/’) soll, der mit “@return ” anfangen soll, der danach keine 1 ([^1]) haben soll und bis zum ‘:’ beliebige Zeichen haben darf. Das ist doch genau, der Fehler
Wenn Sie zuvor noch
:set hls
sagen, zeigt Ihnen der VIM der Fehler auch hervorgehoben.
Um nun das “@return ” am Anfang jeder 2. Return-Zeile wegzulöschen, muss dieser REGEX erst einmal in Substrings zerlegt werden, um später auf einen dieser zuzugreifen und so sagen zu können, dass einer dieser Substrings stehen bleiben soll – nämlich der Return-Wert zzgl. des ‘:’. Dies geschieht mit gequoteten (‘\’) runden Klammern. Nun fehlt noch das Schlüsselwort, um auf den 2. Substring – also den Return-Wert – zugreifen zu können. Dies geschieht mit einer gequoteten (‘\’) Zahl – hier die \2:
:%s/\(@return\) \([^1].*\)/\2/g
Mit dem :%s sagen Sie VIM, dass er etwas suchen und ersetzen soll – gefolgt von dem regulären Ausdruch, den er suchen soll, gefolgt von dem Ausdruck, durch den er ihn ersetzen soll. Das ‘g’ am Schluss steht dafür, dass er dies im gesamten Dokument tun soll.
:%s/[GESUCHER_AUSDRUCK]/[NEUER_AUSDRUCK]/g
Gutes REGEX-VIM-Tutorial: TU-Chemnitz


