Cerca la stringa e ottieni il conteggio nell'editor vi


105

Voglio cercare una stringa e trovare il numero di occorrenze in un file utilizzando l'editor vi.


11
La risposta selezionata ( :g/xxxx/d) è terribile, pericolosa e inferiore alle altre in questa pagina. Si prega di deselezionarlo.
Bruno Bronosky

1
sono d'accordo e ti dice solo "righe eliminate" non "occorrenze eliminate"
user1709076

Risposte:


4
:g/xxxx/d

Questo cancellerà tutte le linee con motivo e riporterà quante cancellate. Annulla per riaverli dopo.


6
Naturalmente, può semplicemente omettere la "d" in modo da non dover eseguire l'operazione.
Rook

15
Nota che questo ti dice solo quante righe, non quante occorrenze. Penso che Dirk sia una soluzione migliore.

4
La mia soluzione di seguito conta correttamente più occorrenze all'interno di una riga e non c'è nulla da annullare.
Mohit Chakraborty

6
Molto pericoloso: o
Ankit Zalani

1
Questa non dovrebbe essere la risposta accettata / più popolare. Cosa stanno facendo i Moderatori SO? :(
user1412066


121

Hai bisogno della nbandiera. Per contare le parole usa:

:%s/\i\+/&/gn   

e una parola particolare:

:%s/the/&/gn        

Vedere la count-itemssezione documentazione.

Se digiti semplicemente:

%s/pattern/pattern/g

poi la riga di stato ti darà anche il numero di corrispondenze in vi.


Sembra che questa risposta sia per gli utenti di Vim e non per Vi :(
kadeshpa

Hai solo vi sul tuo sistema? Quale versione?
Direttamente il

Qualcuno ha etichettato la tua domanda con vim dentro ... L'ho rimosso.
ojblass

38

:% s / string / string / g darà la risposta.


Quale risposta migliore. +5 se possibile
ojblass

Immagino che funzionerebbe solo quando non viene utilizzato ". *" Nel pattern
AK

10
Non c'è bisogno di ripetere la stringa, fallo e basta %s/string//ng.
slm

23

(simile a quanto disse Gustavo, ma in aggiunta:)

Per qualsiasi ricerca precedente , puoi fare semplicemente:

:%s///gn

Un pattern non è necessario, perché è già nel registro di ricerca ( @/).

"%" - fai s/in tutto il file
"g" - ricerca globale (con più risultati in una riga)
"n" - impedisce qualsiasi sostituzione di s/- nulla viene eliminato! niente deve essere annullato!
(vedi: :help s_flagper maggiori informazioni)

(In questo modo, funziona perfettamente con " Cerca testo selezionato visivamente ", come descritto in vim-wikia tip171 )


3

uso

:% S / modello / \ 0 / g

quando la stringa del pattern è troppo lunga e non ti piace digitarla di nuovo.


1

Risposta breve :

:% S / string-to-be-cercato // gn

Per imparare :

Ci sono 3 modalità nell'editor VI come di seguito inserisci qui la descrizione dell'immagine

  • :stai entrando Commandin Command-linemodalità da a . Ora, qualunque cosa tu scriva dopo :è su CLI (Command Line Interface)
  • %sspecifica tutte le linee. Specificare l'intervallo come %mezzo per la sostituzione nell'intero file. La sintassi per la sostituzione di tutte le occorrenze è:%s/old-text/new-text/g
  • gspecifica tutte le occorrenze nella riga. Con la gbandiera si può sostituire l'intera linea. Se questo gflag non viene utilizzato, verrà sostituita solo la prima occorrenza nella riga.
  • n specifica il numero di occorrenze di output
  • //la doppia barra rappresenta l'omissione di replacement text. Perché vogliamo solo trovare.

Una volta ottenuto il numero di occorrenze, è possibile premere il Ntasto per visualizzare le occorrenze una alla volta.

Per trovare e contare in un particolare intervallo di righe da 1 a 10:

: 1,10s / ciao // gn

  • Si noti %che l'intero file viene sostituito da ,numeri di riga separati.

Per trovare e sostituire in un particolare intervallo di righe da 1 a 10:

: 1,10s / HELO / ciao / gn


0

Suggerisco di fare:

  1. Cerca con *per fare una "ricerca delimitata" per quello che c'è sotto il cursore, o per fare una /patternricerca standard .
  2. Utilizzare :%s///gnper ottenere il numero di occorrenze. Oppure puoi usare :%s///nper ottenere il numero di righe con occorrenze.

** Ho davvero potuto trovare un plug-in che desse messaggi di "corrispondenza N di N 1 su N 2 linee" con ogni ricerca, ma ahimè.

Nota: non essere confuso dalla formulazione complicata dell'output. Il primo comando potrebbe darti qualcosa di simile a 4 matches on 3 linesdove potrebbe darti il ​​secondo 3 matches on 3 lines. Sebbene tecnicamente accurato, quest'ultimo è fuorviante e dovrebbe dire "3 linee corrispondono". Quindi, come puoi vedere, non c'è davvero mai bisogno di usare quest'ultima (solo 'n') forma. Ottieni le stesse informazioni, più chiaramente e di più utilizzando il modulo "gn".

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.