Cerca e sostituisci

Suggerimento 31 Monobook stampabile Precedente Successivo

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/gTrova ogni occorrenza di “pippo” (solo nella riga corrente) e sostituiscila con “bar “.:%s/foo/bar/gTrova ogni occorrenza di “foo” (in tutte le righe) e sostituiscila con “bar”.:%s/foo/bar/gcCambia ogni “foo” in “bar”, ma chiedi prima la conferma.:%s/\<foo\>/bar/gcCambia solo le parole intere che corrispondono esattamente a “pippo” a “bar”; chiedi conferma.:%s/foo/bar/gciCambia ogni “foo” (senza distinzione tra maiuscole e minuscole a causa del flagi) in “bar”; chiedi conferma.:%s/foo\c/bar/gcè lo stesso perché\crende la ricerca insensibile alle maiuscole e alle minuscole. Potrebbe essere necessario dopo aver utilizzato:set noignorecaseper rendere le ricerche sensibili al maiuscolo / minuscolo (impostazione predefinita).:%s/foo/bar/gcICambia ogni “pippo” (distingue tra maiuscole e minuscole a causa delIflag) in “bar”; chiedi conferma.:%s/foo\C/bar/gcè lo stesso perché\Cfa distinzione tra maiuscole e minuscole nella ricerca. Potrebbe essere necessario dopo aver utilizzato:set ignorecaseper 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\%Vatom 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 concorrisponde 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).\0inserisce il testo corrispondente allintero pattern\1inserisce il testo del primo backreference.\2inserisce 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/gSostituisci ogni corrispondenza dellultimo pattern di ricerca con “bar”. Ad esempio, potresti prima posizionare il cursore sulla parolafooquindi 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>/gSostituisci 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>/gSostituisci 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/gSostituisci ogni occorrenza di “foo” con il contenuto del registro “a”.<c-r>asignifica che premi Ctrl-R quindia. Il contenuto del registro “a” verrà inserito come se lo avessi digitato.:%s/foo/<c-r>0/gCome 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/gSostituisci 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>//gSostituisci 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/gSostituisci 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/gSostituisci tutte le occorrenze del testo nel registro “a” con “bar”.<c-r>asignifica 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

^Me non vengono trovate. La ricerca funziona se ogni^Mviene 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/gCome 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\>//gIn 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/gIn 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)/gOttieni 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))/gnQuesto 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/gSostituisci “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)

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *