2012-03-07 15 views
5

Ho sempre voluto sapere come si può sostituire con determinati parametri.Vim Substitution

Se si dispone di una linea come questa:

123,Hello,World,(I am, here), unknown 

e si wnat sostituire World con Foobar allora questo è un compito facile: :%s/World/Foobar/

ora mi chiedo come posso liberarmi di un , che è il numero ().

In teoria, devo solo trovare la prima occorrenza di ( quindi sostituire lo , con uno spazio vuoto fino a ).

+2

Leggere la voce delle domande frequenti su [formattazione dei blocchi di codice nelle domande e nelle risposte] (http://meta.stackexchange.com/a/22189/151830)). – Benoit

risposta

4

Prova lookahead e lookbehind affermazioni:

%s/([^)]*\zs,\ze.*)// 

(\zs e \ze dire dove modello inizia e fine)

o

%s/\(([^)]*\)\@<=,\(.*)\)\@=// 

Il primo è più leggibile, il secondo usa i raggruppamenti \(... \) con parentesi all'interno di gruppi che lo fanno sembrare offuscato e \@<= quale apar t da essere un simpatico anatra ASCII-art è l'operatore del guardiano, e \@= che è l'operatore di lookahead.

Riferimenti: :help pattern (più in dettaglio :help /\@=, :help /\ze, ecc)

si utilizza la GUI e vogliono provare questi comandi? Copiali negli Appunti ed esegui :@+ all'interno di Gvim.

0

Per esempio, questo è la stessa cosa, come suggerito dal @ubuntuguy

%s/\(.*\)(\(.*\),\(.*\)/\1(\2\3 

Questo farà il rimontaggio esatto che si desidera.

+0

Sfortunatamente, questo rimuoverà l'ultimo ',', non quello interno '(' ')'. – mouviciel

1

È anche possibile selezionare il testo che si desidera modificare (con le modalità visual o visual-block) e immettere : per avviare il comando di sostituzione. vi avvierà automaticamente il comando con :'<,'> che applica il comando all'area selezionata.

Sostituzione di un , può essere fatto con:

:'<,'>s/,/ /g 
2

modifica leggermente la risposta di @ Tom può darvi una buona e tranquilla "un po '" risultato più leggibile:

%s/\(.*\)(\(.*\),\(.*\))\(.*\)/\1(\2\3)\4/ 

questo modo si avrà: in \1 verrà memorizzato ciò che è a sinistra al di fuori della parentesi, \4 ciò che è alla destra al di fuori della parentesi e \2 e \3 ciò che è all'interno della parentesi, rispettivo a sinistra (\2) ea destra (\3).

Con questo puoi facilmente scambiare i tuoi elementi se il tuo file è organizzato come colonna.

+0

(a proposito la risposta di Benoit è molto più elegante) –

0

Ancora un altro approccio, basato sul fatto che in realtà si desidera sostituire solo la prima occorrenza del , all'interno della parentesi:

:%s#\((.\{-}\),#\1 # 

Spiegazione:

  • :%s per la sostituzione in tutto il file (non utilizzare % se si vuole lavorare solo con la riga corrente)
  • possiamo usare # o : come un delimitatore per rendere il comando più leggibile
  • in (.\{-} chiediamo di trovare qualsiasi simbolo (punto) dopo la parentesi sinistra e il resto indica 0 o più occorrenze (il meno possibile) di questo simbolo. Questa espressione viene inserita all'interno di \(...\) per poter fare riferimento a questo gruppo come \1 in futuro.