creato 2001 · complessità base · versione 6.0
Vim fornisce il :s
(substitute) comando per ricerca e sostituzione; questo suggerimento mostra esempi di come sostituire. Su alcuni sistemi, gvim ha Trova e sostituisci nel menu Modifica (: help: promptrepl), tuttavia è più facile usare il comando :s
grazie alla sua cronologia della riga di comando e alla possibilità di inserire testo (ad esempio, la parola sotto il cursore) nei campi di ricerca o sostituzione.
Ricerca e sostituzione di base
Il comando :substitute
cerca un modello di testo e lo sostituisce con una stringa di testo. Ci sono molte opzioni, ma queste sono probabilmente quelle che vuoi:
:s/foo/bar/g
Trova ogni occorrenza di “pippo” (solo nella riga corrente) e sostituiscila con “bar “.:%s/foo/bar/g
Trova ogni occorrenza di “foo” (in tutte le righe) e sostituiscila con “bar”.:%s/foo/bar/gc
Cambia ogni “foo” in “bar”, ma chiedi prima la conferma.:%s/\<foo\>/bar/gc
Cambia solo le parole intere che corrispondono esattamente a “pippo” a “bar”; chiedi conferma.:%s/foo/bar/gci
Cambia ogni “foo” (senza distinzione tra maiuscole e minuscole a causa del flagi
) in “bar”; chiedi conferma.:%s/foo\c/bar/gc
è lo stesso perché\c
rende la ricerca insensibile alle maiuscole e alle minuscole. Potrebbe essere necessario dopo aver utilizzato:set noignorecase
per rendere le ricerche sensibili al maiuscolo / minuscolo (impostazione predefinita).:%s/foo/bar/gcI
Cambia ogni “pippo” (distingue tra maiuscole e minuscole a causa delI
flag) in “bar”; chiedi conferma.:%s/foo\C/bar/gc
è lo stesso perché\C
fa distinzione tra maiuscole e minuscole nella ricerca. Potrebbe essere necessario dopo aver utilizzato:set ignorecase
per rendere le ricerche insensibili al maiuscolo / minuscolo.
Il flag g
significa globale: ogni occorrenza nella riga viene modificata, anziché solo la prima. Questo suggerimento presuppone limpostazione predefinita per lopzione "gdefault"
e "edcompatible"
(disattivata), che richiede che g
il flag da includere in %s///g
per eseguire una sostituzione globale. Lutilizzo di :set gdefault
crea confusione perché %s///
è globale, mentre %s///g
non lo è (cioè , g
ne inverte il significato).
Quando si utilizza il flag c
, è necessario confermare per ciascuna corrispondenza cosa fare. Vim produrrà qualcosa del tipo: replace with foobar (y/n/a/q/l/^E/^Y)?
(dove foobar è la parte sostitutiva del comando :s/.../.../
. Puoi digitare y
che significa sostituire questa corrispondenza, n
saltare questa corrispondenza, a
sostituire questa e tutte le rimanenti corrispondenze ( “tutte” le corrispondenze rimanenti), q
per chiudere il comando, l
per sostituire questa corrispondenza ed uscire (pensa a “ultimo”), ^E
per scorrere lo schermo verso lalto tenendo premuto il tasto Ctrl e premendo E e ^Y
per scorrere lo schermo verso il basso tenendo premuto il tasto Ctrl e premendo Y. Tuttavia, le ultime due scelte sono disponibili solo se il tuo Vimèun normale, grande o enorme costruito o la funzione insert_expand era abilitata in fase di compilazione (cerca +insert_expand
nelloutput di :version
).
Anche quando si utilizza il flag c
, Vim salterà su t La prima corrispondenza che trova a partire dalla parte superiore del buffer e richiede conferma per eseguire la sostituzione su quella corrispondenza. Vim applica il IncSearch
gruppo di evidenziazione al testo corrispondente per darti un segnale visivo su quale corrispondenza sta operando (impostato su reverse
per impostazione predefinita per tutti e tre i tipi di termine a partire da Vim 7.3). Inoltre, se viene trovata più di una corrispondenza e hai attivato levidenziazione della ricerca con :set hlsearch
, Vim evidenzia le restanti corrispondenze con il gruppo di evidenziazione Search
. Se usi levidenziazione della ricerca, dovresti assicurarti che questi due gruppi di evidenziazione siano visivamente distinti o non sarai in grado di dire facilmente quale corrispondenza Vim ti sta chiedendo di sostituire.
Dettagli
Intervallo di ricerca:
Nota: a partire da Vim 7.3, le sostituzioni applicate a un intervallo definito da indicatori o una selezione visiva (che utilizza un tipo speciale di indicatori “< e “>) non sono delimitati dalla posizione della colonna dei segni per impostazione predefinita. Invece, Vim applica la sostituzione allintera riga su cui appare ogni segno a meno che il\%V
atom viene utilizzato nel pattern come::"<,">s/\%Vfoo/bar/g
.
Durante la ricerca:
.
,*
,\
,specifica una / collection. Gli intervalli di caratteri possono essere rappresentati con un
-
; ad esempio una lettera a, b, c o il numero 1 può essere abbinato a. Nega la raccolta con
corrisponde a qualsiasi carattere tranne a, b, c o 1.
\{#\}
viene utilizzato per la ripetizione./foo.\{2\}
corrisponderà a foo e ai due caratteri seguenti.\
non è obbligatorio per la chiusura}
, quindi/foo.\{2}
farà la stessa cosa.\(foo\)
fa un riferimento a foo. Le parentesi senza escape sono letteralmente abbinate. Qui il\
è richiesto per la chiusura\)
.
Quando si sostituisce:
\r
è una nuova riga,\n
è un byte nullo (0x00).\&
è e commerciale (& è il testo che corrisponde al pattern di ricerca).\0
inserisce il testo corrispondente allintero pattern\1
inserisce il testo del primo backreference.\2
inserisce il secondo backreference e così via.
Puoi utilizzare altri delimitatori con sostituto:
:s#http://www.example.com/index.html#http://example.com/#
Salva la digitazione utilizzando \zs
e \ze
per impostare linizio e la fine di un pattern. Ad esempio, invece di:
:s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Reserved/
Usa:
:s/Copyright \zs2007\ze All Rights Reserved/2008/
Uso della parola corrente o registri
:%s//bar/g
Sostituisci ogni corrispondenza dellultimo pattern di ricerca con “bar”. Ad esempio, potresti prima posizionare il cursore sulla parolafoo
quindi premere*
per cercare quella parola. Il sostituto di cui sopra cambierebbe quindi tutte le parole che corrispondono esattamente a “foo” in “bar”.:%s/foo/<c-r><c-w>/g
Sostituisci ogni occorrenza di “pippo” con la parola sotto il cursore.<c-r><c-w>
significa che premi Ctrl-R e poi Ctrl-W. La parola sotto il cursore verrà inserita come se lavessi digitata.:%s/foo/<c-r><c-a>/g
Sostituisci ogni occorrenza di “pippo” con la parola sotto il cursore (delimitata da spazi).<c-r><c-a>
significa che premi Ctrl-R e poi Ctrl-A. La WORD sotto il cursore verrà inserita come se lavessi digitata.:%s/foo/<c-r>a/g
Sostituisci ogni occorrenza di “foo” con il contenuto del registro “a”.<c-r>a
significa che premi Ctrl-R quindia
. Il contenuto del registro “a” verrà inserito come se lo avessi digitato.:%s/foo/<c-r>0/g
Come sopra, utilizzando il registro 0 che contiene il testo del comando di yank più recente. Esempi di comandi di copia (copia) sonoyi(
che copia il testo tra parentesi attorno al cursore ey$
che copia il testo dal cursore alla fine della riga. Dopo un comando di yank che non ha specificato un registro di destinazione, il testo copiato può essere inserito premendo Ctrl-R quindi0
.:%s/foo/\=@a/g
Sostituisci ogni occorrenza di “foo” con il contenuto del registro “a”.\=@a
è un riferimento per registrare “a”. Il contenuto del registro “a” non è mostrato nel comando. Ciò è utile se il registro contiene molte righe di testo.:%s//<c-r>//g
Sostituisci ogni corrispondenza dellultimo pattern di ricerca con il registro/
(lultimo pattern di ricerca). Dopo aver premuto Ctrl-R quindi/
per inserire lultimo pattern di ricerca (e prima di premere Invio per eseguire il comando), puoi modificare il testo per apportare le modifiche richieste.:%s/<c-r>*/bar/g
Sostituisci tutte le occorrenze del testo negli appunti di sistema (nel registro*
) con “bar” (vedi esempio successivo se multilinea) . Su alcuni sistemi, la selezione del testo (in Vim o in unaltra applicazione) è tutto ciò che è richiesto per inserire quel testo nel registro*
.:%s/<c-r>a/bar/g
Sostituisci tutte le occorrenze del testo nel registro “a” con “bar”.<c-r>a
significa che premi Ctrl-R quindia
. Il contenuto del registro “a” verrà inserito come se lo avessi digitato. Eventuali nuove righe nel registro “a” vengono inserite come
^M
e non vengono trovate. La ricerca funziona se ogni^M
viene sostituito manualmente con “\ n” (due caratteri: barra rovesciata, “n”). Questa sostituzione può essere eseguita durante la digitazione del comando::%s/<c-r>=substitute(@a,"\n","\\n","g")<CR>/bar/g
"\n"
(virgolette doppie) rappresenta il carattere di nuova riga;"\\n"
(virgolette singole) rappresenta due barre rovesciate seguite da “n
“.La funzionesubstitute()
viene valutata dal registro delle espressioni<c-r>=
(Ctrl-R=
); sostituisce ogni nuova riga con una singola barra rovesciata seguita da “n
“.<CR>
indica che premi Invio per terminare lespressione=
.:%s/<c-r>0/bar/g
Come sopra, utilizzando il registro 0 che contiene il testo del comando di yank più recente.
Consulta Incolla i registri nei comandi di ricerca o due punti invece di utilizzare gli appunti.
Esempi aggiuntivi
:%s/foo/bar/
In ogni riga, sostituisci la prima occorrenza di “foo” con “bar”.:%s/.*\zsfoo/bar/
In ogni riga, sostituisci lultima occorrenza di “foo” con “bar”.:%s/\<foo\>//g
In ogni riga, elimina tutte le occorrenze dellintera parola “foo”.:%s/\<foo\>.*//
In ogni riga, elimina lintera parola “foo” e tutto il testo successivo (fino alla fine della riga).:%s/\<foo\>.\{5}//
In ogni riga, elimina la prima occorrenza dellintera parola “foo” e i cinque caratteri seguenti.:%s/\<foo\>\zs.*//
In ogni riga, elimina tutto il testo che segue lintera parola “foo” (fino alla fine della riga).:%s/.*\<foo\>//
In ogni riga, elimina lintera parola “foo” e tutto il testo precedente (dallinizio della riga).:%s/.*\ze\<foo\>//
In ogni riga, elimina tutto il testo che precede lintera parola “foo” (dallinizio della riga).:%s/.*\(\<foo\>\).*/\1/
In ogni riga, elimina tutto il testo che precede e segue lintera parola “foo”.:%s/\<foo\(bar\)\@!/toto/g
In ogni riga, sostituisci ogni occorrenza di “foo” (che inizia una parola e non è seguita da “bar”) con “toto”.:s/^\(\w\)/\u\1/
Se il primo carattere allinizio della riga corrente è solo minuscolo, cambialo in maiuscolo utilizzando\u
(vedi cambiare maiuscolo / minuscolo ).:%s/\(.*\n\)\{5\}/&\r/
Inserisci una riga vuota ogni 5 righe. Il pattern cerca\(.*\n\)
(qualsiasi riga inclusa la sua fine di riga) ripetuta cinque volte (\{5\}
). La sostituzione è&
(il testo trovato), seguita da\r
(nuova riga).:%s/\<foo\(\a*\)\>/\=len(add(list, submatch(1)))?submatch(0):submatch(0)/g
Ottieni un elenco di risultati di ricerca. (lelenco deve esistere) Imposta il flagmodified
, a causa della sostituzione, ma il contenuto rimane invariato. Nota: Con un Vim abbastanza recente (versione 7.3.627 o successiva), puoi semplificarlo in:
:%s/\<foo\(\a*\)\>/\=add(list, submatch(1))/gn
Questo ha il vantaggio che il buffer non sarà contrassegnato come modificato e non viene creato uno stato di annullamento extra. Lespressione nella parte di sostituzione viene eseguita nella sandbox e non è consentita la modifica del buffer.
Casi speciali
Per sostituire i pattern con il testo con distinzione tra maiuscole e minuscole corrispondente, Michael Geddes ” s può essere utilizzato il plugin keepcase, ad esempio:
:%SubstituteCase/\cHello/goodBye/g
Sostituisci “Hello hello helLo HELLO” con “Goodbye goodbye goodBye GOODBYE”
Per modificare gli offset in un file patch (numero di riga di un blocco), questo piccolo frammento può essere utilizzato:
s/^@@ -\(\d\+\),\(\d\+\) +\(\d\+\),\(\d\+\) @@$/\="@@ -".eval(submatch(1)+offsetdiff).",".submatch(2)." +".eval(submatch(3)+offsetdiff).",".submatch(4)." @@"/g
Utile quando vogliamo rimuovere alcuni blocchi da una patch, senza dover applicare la patch lamentarsi delle differenze di offset.
Nota Dovrebbe provare a rendere lespressione più compatta, ma non so come senza avere la possibilità di modificare le righe indesiderate.
Vedi anche: utilizzo di substitute
- 63 Applicazione di sostituti a un blocco visivo
- 81 Sostituisci facilmente caratteri e linee
- 159 Salvataggio di battitura Sostituzione e ricerca
- 406 Delimitatori alternativi per la sostituzione comando
- 438 Cerca e sostituisci in una selezione visiva
- 464 Cerca e sostituisci la parola sotto il cursore
- 479 Sostituisci senza digitare
- 573 Ripetere un sostituto dalla posizione corrente del cursore
- 605 Sostituisci una parola con il testo strappato
- 654 Caratteri speciali nel comando sostitutivo
- 755 Uso di unespressione in comando sostitutivo
- 808 Sostituisci un blocco visivo di testo con un altro blocco simile
- 915 Usare g invece di sostituire
- 971 Sostituire con numeri incrementali
- 1114 Incrementa e sostituisci passo
- 1501 Sostituisci ultima ricerca
Vedi anche: sostituzione in buffer / file
- 382 Cerca e sostituisci in più buffer
- : help: substitute
- : help cmdline-r anges
- : pattern di aiuto
- : help “gdefault”
- : registri di aiuto
DA FARE
lampia sezione “vedi anche” può essere utile ai lettori. Dobbiamo unire alcuni dei suggerimenti correlati (ma non rendere il risultato troppo complesso). Ho incluso i numeri dei suggerimenti per aiutare gli editori a tenerne traccia.
Vorrei una breve sezione che menzioni che i sostituti semplici sono spesso i migliori gestito effettuando una ricerca, quindi modificandolo manualmente (e premendo .
per ripetere lultima modifica). Inoltre, puoi decidere come modificare ciascuna istanza.Consulta Copiare o modificare lhit di ricerca per una tecnica in cui è possibile premere n
per trovare listanza successiva, quindi digitare cs
per modificare lhit di ricerca a qualunque cosa.
Recentemente cè stato un cambiamento nel modo in cui funziona% s? In qualche modo posso utilizzare sia < cr > e \ = @ come sostituti, ma “non posso usarli come ricerche e sostituzioni.
Se descrivi esattamente cosa fai e cosa succede, potrei essere in grado di aiutarti anche se vedi fare domande. JohnBeckett (discorso) 02:15, 1 giugno 2019 (UTC)