2009-05-02 7 views
2

Ich habe eine Zeile wie folgt.double zitieren die Saiten in der Klammer

fullname = (dies ist ein Testname);

Ich möchte alle Zeichenfolgen innerhalb "(" und ")" doppelt angeben.

d. H. Fullname = ("dies ist" "a" "test" "name");

Kann jemand mir einen vim Regex geben, um das zu tun?

Antwort

3

Dies tut es:

:%s/\v(\(.*)@<=[[:alnum:]]+(.*\))@=/"&"/g 

Beachten Sie, dass verschachtelte Muster passende (wie in Klammern) mit regex schief gehen, wenn die Eingabe ungültig ist. Das oben beschriebene Verfahren behandelt keine verschachtelten Klammern, und in Klammern gesetzte oder umgebrochene Klammern werden es auch brechen. Mit Vorsicht behandeln.

Er lautet wie folgt:

 
:%s    substitute on all lines 
/    matching 
\v    (with "very magic" switched on) 
(\(.*)@<=   a position that follows an opening paren, on this line 
[[:alnum:]]+  a series of alphanumeric characters (i.e. "words") 
(.*\))@=   that are followed by a closing paren, on this line 
/    replace with 
"&"    the match, in quotes 
/g    globally 

Es ist eine bemerkenswerte Tatsache, dass vim tatsächlich variabler Länge Blick hinter unterstützt. Die meisten modernen Regex-Implementierungen tun dies nicht.

+0

Was macht Magie? – chappar

+0

Es entfernt die Notwendigkeit, bestimmte Zeichen zu entkommen, wodurch die Regex kürzer als normal wird. Siehe vim help -: h \ v – Tomalak

0

Dieser Befehl setzt alles, was nicht Platz ist, Tab, Gleichheitszeichen, paren oder Semikolon Anführungszeichen:

:s/[^ \t=();][^ \t=();]*/"&"/g 

Bitte beachten Sie, dass diese fullname auch zitiert, aber Sie können diese Zitate manuell entfernen.

Manchmal lohnt es sich, einen Teil der Arbeit manuell zu erledigen, weil die Automatisierung langsamer wäre.

Führen Sie den Befehl:

:help substi 

zu Hilfe zu regexp Substitution in vim zu erhalten.

+0

@pts, möchte ich keine manuelle Entfernung – chappar

+0

Nicht funktionieren. Dies schließt alles in Anführungszeichen ein. – Tomalak

+0

Ich denke, es funktioniert wie in der Antwort dokumentiert, ich habe es versucht, bevor ich meine Antwort einreichte. Was meinst du mit "alles"? – pts

4

Ich würde dies wie folgt tun:

:s/\<\w\+\>/"&"/gc 

Aufgrund der Bestätigungsschalter ‚c‘ Sie für jeden Ersatz gefragt. Beantworten Sie 'n' (nein) für die Ersetzung von 'fullname' und 'a' (all) für den Rest der Zeile.

+0

Diese Antwort löst das Problem nicht wirklich. Es macht den "quote all words" -Teil, aber vergisst den "nur in Klammern" -Teil vollständig. – Tomalak