Rimuovi le righe che non contengono una parola in Vim [duplicato]


2

In Vim trovo spesso che sono interessato solo alle righe contenenti una determinata stringa di testo e voglio eliminare tutte le altre righe.

È facile abbinare le righe contenenti una stringa:

:s/^.*foo.*\n//

Quello che normalmente finisco per fare sono due passaggi, uno per "contrassegnare" tutte le linee che voglio con un primo carattere speciale:

:s/^\(.*foo.*\)$/X\1/

E nel secondo passaggio è facile fare una corrispondenza negativa per un personaggio in una posizione fissa, quindi elimino tutte le linee senza la mia stringa in questo modo:

:s/^[^X].*\n//

Ma non c'è un modo molto più semplice per farlo con un solo passaggio? Cosa mi sto perdendo?


Penso che questo sia stato chiesto prima nonostante non lo avessi trovato in quel momento: vim elimina tutte le righe che NON contengono una determinata parola
hippietrail

Risposte:


9

Ciò eliminerebbe tutte le righe che non contengono foo.

:g/^\(.*foo\)\@!.*$/d

Invece, puoi anche usare :vper invertire il senso del modello di ricerca.

:v/\(foo\)/d

Puoi leggere di più sul modo :ge :vlavorare qui .

E altro sulla definizione di intervalli, uso di metacaratteri ecc. Per la ricerca e la sostituzione qui .


Sembra :gsia uno dei tanti comandi vim che non ho mai imparato prima - grazie! (-:
hippietrail,

Perché \(e \)?
Bernhard,

1
+, ?, |, {, }, (, E )deve essere sfuggito ad usare la loro funzione speciale.
abhshkdz,

Io uso :ge :vmolto. Se, per qualche motivo, :vnon si attacca, puoi usarlo :g!.
romainl,

0

Bene, se il tuo obiettivo è solo quello di rimuovere le righe con il testo, questo può essere facilmente fatto con awk in questo modo:

awk '/regex/{print}' filename

Significa che awk agirà sul nome del file. Puoi reindirizzarlo a un nuovo nome file o allo stesso nome file, in questo modo -

   awk '/regex/{print}' filename > filename.tmp && mv filename.tmp filename

Mentre ho installato vim su ogni piattaforma che uso, di solito ho awk solo quando sono su * nix. Ultimamente sono principalmente su Windows. Quindi cerco una risposta basata su VIM. Grazie comunque.
hippietrail,

Ho appena capito che la mia soluzione iniziale non avrebbe funzionato ... quindi se lo usi ogni volta, dovresti farlo in questo modo!
Kitchi,
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.