2014-09-15 18 views
6

Sto modificando un file e voglio cambiare solo una parola specifica con un'altra parola, ma solo per le prime occorrenze N. Ho provato più comandiVIM: ricerca e sostituzione delle prime occorrenze N di una parola

N :s/word/newword/

:%s/word/newword/count

e altri comandi che ho potuto trovare su google. Ma nessuno di loro funziona.

EDIT :: I comandi Vim sono preferiti. Ma è possibile utilizzare anche lo script Vim. Non ho alcuna precedente esperienza in scripting vim.

+0

': s/parola/newword/N' è l'unico comando valido, ma sostituisce la prima occorrenza sulle successive righe N. E se hai usato il flag/g, sostituirà tutte le occorrenze sulle N righe successive. Neanche il conteggio esatto che desideri. – Caek

risposta

13

Usando una registrazione usa e getta permette di controllare esattamente quanti cambiamenti che fate:

qq    " start recording in register q 
/foo<CR>  " search for next foo 
cgnbar<Esc> " change it to bar 
q    " end recording 
[email protected]   " play recording 11 times 

Vedi :help recording e :help gn.

Un altro modo, utilizzando :normal:

:norm! /foo<C-v><CR>cgnbar<C-v><Esc>  <-- should look like this: :norm! /foo^Mcgnbar^[ 
[email protected]: 

Vedi :help :normal e :help @:.

O semplicemente:

:/foo/|s//bar<CR> 
[email protected]: 
+0

Punti bonus per un uso intelligente di 'gn'! – Ben

+0

@romainl Puoi spiegare il significato di ogni riga e attributo? – Ignited

+1

@Ignited, ho aggiunto i puntatori ': help'. Chiedimi se hai domande su parti specifiche della mia risposta. – romainl

1

Non sono sicuro su come specificare i primi N occorrenze, ma io uso spesso questo comando:

:%s/word/newword/gc 

Vim chiede poi la conferma di ogni occorrenza di word in modo da poter selettivamente modificare alcuni ma non altri.

+1

Sarà molto noioso e alte possibilità di errore di conteggio umano quando N è grande – Ignited

+0

Sì, è vero. Ma quando N non è grande, dà molto più controllo su ciò che è cambiato. –

+0

Inoltre, questo è un comando più facile da capire rispetto agli altri proposti in questa discussione. – Moebius

9

Anche se un po 'più a lungo, si può fare:

:call feedkeys("yyyq") | %s/word/newword/gc 

per sostituire i primi 3 occorrenze e poi fermarsi. È possibile modificare la quantità di y per più o meno sostituzioni. (È inoltre possibile utilizzare uno o più numeri di telefono)

Spiegazione: questo sta alimentando le combinazioni di tasti nell'opzione di conferma /c 012 del comando di sostituzione.

+4

': chiamata feedkeys (ripetere (" y ", 3)." Q ") | % s/test/toast/gc' per un importo specifico. Dove 3 è il numero di occorrenze da sostituire. – Caek

+2

Idea molto intelligente. – romainl

+0

Ho riso un po 'quando ho capito che avevo ancora il mio test/toast lì da test, ma ottieni il punto :) – Caek

2

mio PatternsOnText plugin fornisce (tra gli altri) un comando che prende le risposte sotto forma di uno yyynyn o 1-5:

:%SubstituteSelected/word/newword/g 1-5 
Problemi correlati