Introduzione

Questo articolo descrive come trovare e sostituire il testo in Vim/Vi.

Vim è l'editor di testo da riga di comando più popolare. Viene preinstallato su macOS e sulla maggior parte delle distribuzioni Linux. Trovare e sostituire il testo in Vim è semplice e veloce.

Trovare e sostituire (Find and Replace)

In Vim, puoi trovare e sostituire il testo usando il comando :substitute(:s).

Per eseguire comandi in Vim, devi essere in modalità normale, la modalità predefinita all'avvio dell'editor. Per tornare alla modalità normale da qualsiasi altra modalità, è sufficiente premere il tasto "Esc".

La forma generale del comando sostitutivo è la seguente:

:[range]s/{pattern}/{string}/[flags] [count]

Il comando cerca un {pattern} in ogni riga [range] e lo sostituisce con una {string}. [count] è un numero intero positivo che moltiplica il comando.

Se nessun [range] e [count] sono dati, solo il pattern trovato nella linea corrente viene sostituita. La riga corrente è la riga in cui è posizionato il cursore.

Ad esempio, per cercare la prima occorrenza della stringa 'foo' nella riga corrente e sostituirla con 'bar', dovresti usare:

:s/foo/bar/

Per sostituire tutte le occorrenze del modello di ricerca nella riga corrente, aggiungi il flag g:

:s/foo/bar/g

Se desideri cercare e sostituire il testo nell'intero file, utilizza il carattere percentuale % come intervallo. Questo carattere indica un intervallo dalla prima all'ultima riga del file:

:%s/foo/bar/g

Se la parte {string} viene omessa, viene considerata come una stringa vuota e il modello corrispondente viene eliminato. Il seguente comando elimina tutte le istanze della stringa 'foo' nella riga corrente:

:s/foo//g

Al posto del carattere barra (/), è possibile utilizzare qualsiasi altro carattere a byte singolo non alfanumerico tranne come delimitatore. Questa opzione è utile quando hai il carattere "/" nella stringa di ricerca o nella stringa di sostituzione.

:s|foo|bar|

Per confermare ogni sostituzione, usa il flag c:

:s/foo/bar/gc
replace with bar (y/n/a/q/l/^E/^Y)?

Premere y per sostituire la corrispondenza o l per sostituire la corrispondenza e uscire. Premere n per saltare il risultato corrente e q o Esc per interrompere la sostituzione. L'opzione a sostituisce la corrispondenza e tutte le rimanenti occorrenze della corrispondenza. Per scorrere lo schermo verso il basso, utilizzare CTRL+Y e per scorrere verso l'alto, utilizzare CTRL+E.

Puoi anche utilizzare espressioni regolari come modello di ricerca. Il comando qui sotto sostituisce tutte le righe che iniziano con 'foo' con 'Vim':

:%s/^foo.*/Vim/gc

Il simbolo ^ (accento circonflesso) corrisponde all'inizio di una riga e .* corrisponde a qualsiasi numero di caratteri.

Maiuscole e minuscole (Case Sensitivity)

Per impostazione predefinita, l'operazione di ricerca fa distinzione tra maiuscole e minuscole, la ricerca di "FOO" non corrisponderà a "Foo".

Per ignorare le maiuscole e minuscole per la stringa di ricerca, usa il flag i:

:s/Foo/bar/gi

Un altro modo ignorare le maiuscole è quello di aggiungere \c dopo il modello di ricerca. Ad esempio, /Linux\c esegue la ricerca e ignora maiuscole e minuscole.

Se hai modificato l'impostazione predefinita delle maiuscole e delle minuscole e desideri eseguire una ricerca sensibile al maiuscolo e minuscolo (case sensitive), utilizza il flag I:

:s/foo/bar/gi

Il metodo alternativo in questo caso, è quello di aggiungere \C  dopo la stringa di ricerca.

Gamma di ricerca (Search Range)

Quando non è specificato alcun intervallo, il comando substitute funziona solo nella riga corrente.

L'intervallo può essere una riga o un intervallo tra due righe. Gli specificatori di riga sono separati dai caratteri , o ;. L'intervallo può essere specificato utilizzando il numero di riga assoluto o simboli speciali.

Ad esempio, per sostituire tutte le occorrenze di "foo" con "bar" in tutte le righe dalla riga 3 alla riga 10, usate questo comando:

:3,10s/foo/bar/g

L'intervallo è inclusivo, il che significa che la prima e l'ultima riga sono incluse nell'intervallo.

Il carattere punto . indica la riga corrente e il segno di dollaro $ indica l'ultima riga. Per sostituire 'foo' in tutte le righe a partire dalla riga corrente fino all'ultima usate questo comando:

:.,$s/foo/bar/

Lo specificatore di riga può anche essere impostato utilizzando il simbolo "+" o "-", seguito da un numero che viene aggiunto o sottratto dal numero di riga precedente. Se il numero dopo il simbolo viene omesso, il valore predefinito è 1.

Ad esempio, per sostituire ogni "foo" con "bar" a partire dalla riga corrente e dalle quattro righe successive, digitare:

:.,+4s/foo/bar/g

Sostituire la parola intera

Il comando substitute cerca il pattern come una stringa, non come una parola intera. Se, ad esempio, stai cercando "gnu", la ricerca trova le corrispondenze in cui "gnu" è incorporato in parole più grandi, come "cygnus" o "magnum".

Per cercare una parola intera, digita \< per contrassegnare l'inizio di una parola, inserisci il modello di ricerca, digita \> per contrassegnare la fine di una parola:

Ad esempio, per cercare la parola "foo" utilizzeresti \<foo\>:

:s/\<foo\>/bar/

Sostituire la storia

Vim tiene traccia di tutti i comandi eseguiti nella sessione corrente. Per sfogliare la cronologia per i comandi di sostituzione precedenti, immettere :s e utilizzare i tasti freccia su/giù per trovare un'operazione di sostituzione precedente. Per eseguire il comando, è sufficiente premere Enter. È inoltre possibile modificare il comando prima di eseguire l'operazione.

Esempi

Righe di commento (aggiungere # prima della riga) da 5 a 20:

:5,20s/^/#/

Rimuovi il commento dalle righe da 5 a 20, annulla le modifiche precedenti:

:5,20s/^#//

Sostituisci tutte le occorrenze di "mela", "arancia" e "mango" con "frutta":

:%s/apple\|orange\|mango/fruit/g

Rimuovi gli spazi vuoti finali alla fine di ogni riga:

:%s/\s\+$//e

Conclusione

La ricerca e la sostituzione è una potente funzionalità di Vim, che ti consente di apportare modifiche al testo rapidamente.