Suchen und Ersetzen in VI

Suchen und Ersetzen in VI

Ich muss in der folgenden Zeichenfolge „12.22.54“ in „12:22:54“ konvertieren, damit es in MS SQL funktioniert.

cast('14-JAN-14 06.65.22 AM' as datetime),'63.124.79.253');
cast('14-JAN-14 12.22.36 AM' as datetime),'63.124.79.253');
cast('14-JAN-14 22.13.54 AM' as datetime),'63.124.79.253');

Ich habe versucht, die Datei in vi zu öffnen und zu ersetzen wie

:s/(\d\{2\})\.(\d\{2\}z)\.(\d\{2\})/$1:$2:$3/g

Aber es funktioniert nicht. Bitte helfen Sie.

Antwort1

Um die IP-Adresse zu vermeiden, setze ich einfach Leerzeichen um die entsprechende Zeichenfolge:

:%s/ \(\d\d\)\.\(\d\d\)\.\(\d\d\) / \1:\2:\3 /g

Antwort2

viverwendet keine regulären Ausdrücke im Perl-Stil. Sie haben geschrieben

:s/(\d\{2\})\.(\d\{2\}z)\.(\d\{2\})/$1:$2:$3/g

verwendet aber vieine Syntax wie diese (vim und vile akzeptieren \d, aber Sie sagten"vi"):

:s/\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)/\1:\2:\3/g

(Woher kommt das „z“?).

Der Punkt ist, dass das, was Perl als „veraltet“ bezeichnet, die POSIX-Syntax für Rückverweise ist. Perl wird natürlich nie standardisiert werden, solange Larry Wall am Leben ist.

Laut Kommentar war es die Absicht des OP, alle Zeilen zu ändern. In vi geschieht dies mithilfe des speziellen Bereichs %:

:%s/\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)/\1:\2:\3/g

Man könnte auch explizit einen Bereich verwenden ($ist POSIX auch):

:1,$s/\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)/\1:\2:\3/g

Es gibt noch andere Möglichkeiten, die Grenzen so zu konstruieren, dass keine IP-Adressen verwendet werden. Im angegebenen Beispiel reicht jedoch ein Leerzeichen aus:

:s/ \([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\) / \1:\2:\3 /g

Ebenfalls,vimUndabscheulichakzeptieren \sfür Leerzeichen, aber POSIX würde nur ein wörtliches Leerzeichen (wie gezeigt) oder eine Zeichenklasse akzeptieren [:space:]. Die meisten Leute finden das Tippen [spacetab]weniger problematisch als [[:space:]].

Wie bereits erwähnt, wenn Sie "vi" sagen, können andere basierend auf dem Standardverhalten (POSIX) antworten. Einige Editoren, die anstelle von "vi" verwendet werden können, bieten Erweiterungen der Syntax für reguläre Ausdrücke. Eine schnelle Überprüfung zeigt, dassElvisunterstützt auch den Perl-Stil \dund \s, währendnvi(der standardkonformste der vier) tut dies nicht.

verwandte Informationen