2013-04-22 11 views
5

Dire che ho righe come questa:ricerca e la sostituzione senza consumare quello che stai cercando per

'alpha' 123 
'beta' 678 
'alpha' 998 
'gamma' 212 

E utilizzando la ricerca & sostituzione regex in VIM, trasformarlo in questo:

'alpha' 123 : alpha 
'beta' 678 : beta 
'alpha' 998 : alpha 
'gamma' 212 : gamma 

Fondamentalmente , la ricerca non sostituirà ciò che sta cercando, ma semplicemente la userà per qualcos'altro. Nella mia testa, questo dovrebbe funzionare:

:g/'\(.*\)'/s/$/: \1/g 

Ma questo non l'ha fatto. Come posso non consumare ciò che sto cercando, ma conservarlo per l'uso?

risposta

1

è possibile farlo direttamente nel comando sostituto, utilizzando il \zs che è davvero utile per costruire le cose come lo zero corrisponda alla larghezza (che non vuol "consumano").

:%s/'\(.*\)'.*\zs/ : \1 

Il \zs segna l'inizio della partita. È come "iniziare la partita qui". Quindi, prima viene catturato il contenuto della parentesi, quindi lo .* in eccesso corrisponde a tutto fino alla fine della riga e lo \zs ora ripristina la corrispondenza con quel punto, ovvero non fa parte della corrispondenza, ma il contenuto dei parenti sono stati catturati.

La parte di sostituzione sostituisce la fine della posizione della linea con : e il gruppo corrispondente.

:h \zs

+1

Questo è exac quello che speravo! Grazie! – Bromide

0

Questo comando dovrebbe funzionare:

:%s/\v'(\w*)'.*/\0 : \1 

(beh, lo ha fatto qui con il testo di esempio)

5

L'iniziale g per la partita non cattura per la sostituzione; è usato solo per il raggruppamento per la ricerca. Invece utilizzare questo, che è un po 'più semplice troppo:

%s/'\(.*\)'.*/& : \1/ 

Il & sostituisce tutto ciò che è stato abbinato.

+0

Sto usando una variante dell'esempio sidyll ha dato, ma questo è buono pure :-) – Bromide

0

macro funziona per il tuo esempio troppo: (non prova in vim, ma dovrebbe funzionare.)

cursore all'inizio della prima riga:

qqyi'A : <esc>pjq 

poi [email protected] (x è quante volte si vuole fare)

Problemi correlati