2010-06-23 15 views
19

Capita a volte di dover controllare vari file di registro e di traccia su Windows e generalmente utilizzo VIM allo scopo.Trova la prima riga non corrispondente in VIM

Il mio problema è però che non riesco ancora a trovare alcuna analogico di grep -v all'interno del VIM: trovare nel buffer di una linea non corrispondenza data espressione regolare. Per esempio. il file di registro è pieno di righe che da qualche parte in mezzo contengono la frase all is ok e ho bisogno di trovare la prima riga che non contenga all is ok.

Posso scrivere una funzione personalizzata per questo, ma al momento sembra essere eccessivo e probabilmente più lento di una soluzione nativa.

C'è un modo semplice per farlo in VIM?

risposta

13

è possibile utilizzare negativo look-dietro operatore @<!

esempio per trovare tutte le righe che non contengono "a", utilizzare /\v^.+(^.*a.*$)@<!$

(\v provoca solo alcuni operatori come ( e @<! non deve essere stato backslash sfuggito)

il metodo più semplice è quello di eliminare tutte le linee corrispondenti o che non corrisponde il modello (o :g/PATTERN/d:g!/PATTERN/d rispettivamente)

+0

'/^.\+\(^.all è ok. * $ \) \ @ Dummy00001

+0

': g!/PATTERN/p' produce troppa uscita. per alcuni file di linea mln che non è un'opzione. ma ': g!/PATTERN/d' sembra molto utile per es. per lavorare con il buffer letto da stdin, non ancora salvato in un file. – Dummy00001

+0

Uhm ... ovviamente il ': g!/PATTERN/d' per il mio caso (ignora le linee non interessanti macinaggio PATTER) dovrebbe essere scritto come': g/PATTERN/d' - senza! - per rimuovere le linee non interessanti. – Dummy00001

2

ho solo gestito una procedura un po 'klutzy utilizzando il comando "g":

:%g!/search/p 

che indica di stampare il non-matching linee ... non so se questo ha funzionato, ma lo ha fatto finire con il cursore posizionato sulla prima riga non corrispondente.

(sostituire qualche altra stringa per "ricerca", naturalmente)

+2

E ': v' è un sinonimo di': g! ', Ovviamente. – Cascabel

+0

@Jefromi: Grazie per quello, mi ero dimenticato di ': v'. –

5

sono spesso nel tuo caso, in modo da file "puliti" i registri che uso:

:g/all is ok/d 

tuo grep -v può essere realizzato con

:v/error/d 

che rimuoverà tutte le linee che non non contengono errore.

19

Credo che se si desidera semplicemente posizionare il cursore alla prima riga non corrispondente, è possibile utilizzare visual come comando nel comando globale. Quindi:

:v/pattern/visual 

lascerà il cursore sulla prima riga non corrispondente. Oppure:

:g/pattern/visual 

lascerà il cursore sulla prima riga corrispondente.

+1

il comando visivo può anche essere abbreviato in vi ... così puoi fare: v/pattern/vi –

+0

Questa è chiaramente la migliore risposta. Perché non è stato scelto !? – histumness

+3

Trova la prima riga non corrispondente a partire dall'inizio del file, ma non partendo dalla posizione corrente del cursore. Usa ':., $ V/pattern/vi' per cercare dalla posizione del cursore. –

3

Probabilmente è già troppo tardi, ma penso che questo dovrebbe essere detto da qualche parte.

Vim (dalla versione circa 7.4) viene fornito con un plug-in chiamato LogiPat, che facilita la ricerca di linee che non contengono stringhe. Quindi, utilizzando questo plugin trovare le linee che non contengono all is ok è fatto in questo modo:

:LogiPat !"all is ok" 

E poi si può saltare tra l'abbinamento (o in questo caso non corrispondenti) linee con n e N.

è possibile utilizzare anche le operazioni logiche come & e | di aderire diverse stringhe in uno schema:

:LP !("foo"|"bar")&"baz" 

LP è una scorciatoia per LogiPat, e questo comando cercherà per le linee che contengono la parola baz e don' t non contiene né foobar.

Problemi correlati