2011-11-17 15 views
11

Vorrei usare Vim per abbinare un'espressione regolare ed eseguire una sostituzione. Ho un file TSV con linee simili a questa:Asserzione positiva e sostituzione con Vim?

rs11223-A  -A 
rs23300-G  -TTA 
rs9733-T   -G 
rs11900000-GT -TTG 

desidero sostituire il trattino (-) di caratteri per una scheda solo nella prima colonna, dopo le rs ...

In Vim I stava tentando di eseguire la sostituzione con:

:%s/(?<=^rs[0-9]{1,12})-/\t/g 

qualcuno potrebbe sottolineano qual è il mio problema e una soluzione giusta?

risposta

17

Può dipendere dalla configurazione, ma nel mio ambiente devo anteporre { , } con \.

Inoltre, Vim ha \zs e \ze per avviare e terminare la corrispondenza, quindi di solito non si ha a che fare con il normale effetto di regex.

Questo non fa ciò che si vuole:

:%s/^rs\d\{1,12}\zs-/\t/g 
0

si desidera che il seguente:

%s/^\(rs[0-9]\{1,12\}\)-/\1\t/g 

Vim espressioni regolari necessitano di alcune sequenze di escape speciali per {, }, ( e ).

Inoltre, nella sezione di sostituzione, è necessario \1 per inserire la stringa corrispondente.

7

positiva guardare dietro viene fatto usando:

\@<= 

Così si potrebbe usare qualcosa come:

:%s/\d\@<=-/\t/g 

I suoi dati reali potrebbero essere più complessi, ma con quello che hai postato si potrebbe anche solo accontentarsi per:

:%s/-/\t 

Se rs dovrebbe essere all'inizio della riga, è possibile utilizzare \zs per specificare l'inizio della partita e l'uso di ancoraggio (^):

:%s/^rs\d*\zs-/\t 
+0

# 2 dovrebbe essere:% s/^ rs \ d \ @<= -/\ t/g – KomodoDave

+0

@KomodoDave: Il tuo pattern corrisponderebbe a 'rs' all'inizio della riga, immediatamente seguito da un trattino (' -') preceduto da una * singola * cifra (aspetto positivo dietro '\ d \ @<= -'). Nessuna delle righe nei dati forniti corrisponde a tale modello. Se insisti per ancorare, potresti usare il modello che ho appena aggiunto. –

+0

Ho pensato che OP significava colonna nel senso delle colonne di caratteri, ma forse non lo è. Ho copiato il tuo per modificarlo e non ho sostituito \ d con - come intendevo - quello che volevo scrivere è::% s/^ rs - \ @<=/\ t/g che corrisponde a '-' nel primo colonna char dopo 'rs' all'inizio della riga. – KomodoDave

Problemi correlati