cerca le linee che contengono un motivo ma non contengono un secondo motivo


15

Devo cercare le righe che contengono qualche parola ma non contengono una seconda parola.

Ad esempio, trova le righe che contengono la parola "Questo" ma non la parola "rosso"

in modo che per un file contenente queste righe

This is a blue coat
This is a red  coat
This is a purple coat
That is a coat

La ricerca individuerebbe solo la prima e la terza riga.

Grazie per qualsiasi consiglio!


È possibile utilizzare il plug-in LogiPat distribuito con i nuovi Vims
Christian

Risposte:


23

È possibile utilizzare questo comando per stampare righe contenenti Thise non red:

:g/\(.*This\)\&\(.*red\)\@!
  • \&separa i rami come un logico ANDperché vogliamo le linee che soddisfano le due condizioni (rami),
  • \(.*This\)è il primo ramo, potrebbe semplicemente essere Thisma è più generico in quel modo,
  • \(.*red\)\@!è il secondo ramo, \@!significa "corrispondenza larghezza zero se l'atomo precedente non corrisponde", come un logico NOT.

In altre parole:

\(.*This\)  \&  \(.*red\)\@!
°°°°°°°°°°  °°  °°°°°°°°°°°°
'This'      AND NOT 'red'

Molte grazie, è molto simile a una query tramite testo formattato. Sono stato in grado di utilizzare questo per trovare funzioni mancanti di docstring.
Joshua Detwiler,

1

Dai un'occhiata a questo post.

Combinalo con la risposta di @romainl e puoi fare quello che vuoi.

Esempio: diciamo che voglio aggiungere consta alle funzioni che non li hanno.

    handleChange = value => {

Script VIM:

%s/\([ ]*\)\(\w* = .*$\)\&^\(\&\(.*const.*\)\@!.\)*$/\1const \2/gc

Produzione:

    const handleChange = value => {

Spiegazione:

\([ ]*\)\(\w* = .*$\)

- prendimi tutte le righe che ha word =

\&

- combina le regole

^\(\&\(.*const.*\)\@!.\)*$

- la riga non deve contenere const.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.