Come si cerca un testo in Vim?
Premere il tasto /, digitare il testo da cercare e premere invio. Questo è proprio come il comando less.
Ma questo metodo di ricerca del testo non ti consente di sostituire il risultato trovato.
Consentitemi di condividere come puoi trovare e sostituire in Vim .
:%s/foo/bar/gci
Il comando precedente eseguirà una ricerca senza distinzione tra maiuscole e minuscole per trovare tutte le occorrenze del termine di ricerca (foo) con il nuovo termine (bar). Con il flag c chiede conferma prima di sostituire qualsiasi sostituzione.
Lasciami andare nel dettaglio e spiegare le cose in modo più chiaro.
Utilizzare il comando sostitutivo per trovare e sostituire il testo in Vim
Immagino che tu sappia già che per eseguire un comando in Vim, devi essere in modalità normale (nota anche come modalità di comando). Premi il tasto Esc per entrare in questa modalità.
Vim ha un comodo comando :substitue
, può essere utilizzato anche con la versione più breve :s
.
Di seguito è riportata la sintassi generale del comando sostitutivo:
:[range]s/{pattern}/{string}/[flags] [count]
Analizziamo questa sintassi. Qualsiasi elemento tra parentesi quadre '[]' è facoltativo.
range
:Questa parte della sintassi può essere utilizzata se si desidera la sostituzione tra dette righe. Se non menzioni un intervallo, sostituirà solo il testo sulla riga corrente . (Ho condiviso una tabella per l'intervallo)pattern
:qui è dove specifichi il testo che vuoi sostituire.string
:Questa è la stringa che sostituirà il pattern.flags
:Per sostituire tutte le occorrenze del modello di ricerca, usa ilg
bandiera. Puoi specificare se vuoi che la corrispondenza ignori maiuscole e minuscole, usai
bandiera. Per confermare manualmente ogni operazione di ricerca e sostituzione, utilizzare ilc
bandiera.count
:numero di righe in cui sostituire il testo.
Gamma | Descrizione |
---|---|
. | Linea corrente |
$ | Ultima riga |
% | Tutte le righe |
x | Numero riga x |
.,+x | Dalla riga corrente fino a ulteriori x righe |
Esempi di ricerca e sostituzione in Vim
Esaminiamo alcuni esempi che dimostrano l'uso del comando sostitutivo in Vim.
Di seguito è riportato lo screenshot del file che userò per dimostrare l'utilizzo del comando sostitutivo in Vim.

Sostituzione del testo di base
Per questo esempio, mi sono assicurato che la stringa "Hello" si verificasse più volte in almeno una riga e più volte nel file.
Voglio sostituire 'Hello' con la stringa 'HI'. Di seguito è riportato il comando Vim per farlo:
:%s/Hello/HI/g

Sostituisci con conferma
Per sostituire il testo, ma vuoi una conferma ogni volta che lo fai, puoi usare il c
nel comando sostitutivo.
:%s/Hello/HI/gc

Come puoi vedere dal video, Vim mi chiede una conferma ogni singola volta prima di sostituire uno schema.
Hai anche un prompt che assomiglia alla seguente riga:
replace with HI (y/n/a/q/l/^E/^Y)?
Le opzioni del prompt hanno il seguente significato:
- y:sì
- n:no
- a:tutto
- q:esci senza sostituire, ma non si annulla una volta che hai già sostituito il testo
- l:sostituisci questo ed esci (pensa a 'ultimo')
- ^E:Scorri verso l'alto (non funziona in
vim-tiny
) - ^Y:Scorri verso il basso (non funziona in
vim-tiny
)
Sostituzione senza distinzione tra maiuscole e minuscole
Quando vuoi sostituire il testo indipendentemente dal fatto che sia in maiuscolo o minuscolo, in tal caso (haha) dovresti usare il i
flag nel comando sostitutivo.
:%s/hello/HI/gi

Se noti, tutte le occorrenze di "ciao" o "ciao" e persino "ciao" vengono sostituite con "CIAO". Questa è una sostituzione del modello senza distinzione tra maiuscole e minuscole.
Ogni "ciao" viene sostituito con "CIAO" anche se la maggior parte di "ciao" contiene una "H" maiuscola.
Sostituisci il testo in una singola riga in Vim
Per sostituire il testo in una singola riga, dobbiamo specificare l'intervallo che limita l'ambito della sostituzione alla riga corrente.
Per questo, è meglio usare il .
descrittore di intervallo.
:.s/Hello/HI/g

Come puoi vedere, solo il pattern nella prima riga è stato sostituito perché ho usato il punto '.' descrittore di intervallo.
Suggerimento bonus:utilizzo di un delimitatore diverso
Osservando la sintassi del comando sostitutivo, ho menzionato che il modello e la stringa sono separati da una barra '/'.
Ma cosa succede se avessi un testo con molte barre in avanti in pattern/string, come un percorso, che si ripete ovunque nel file? Sfuggire alle barre in avanti può essere noioso e a volte può essere facilmente mancato.
Quindi, invece di utilizzare il carattere barra in avanti come delimitatore, puoi invece utilizzare un delimitatore diverso.
Alcuni caratteri delimitatori che ho visto essere usati sono #
, _
e @
.

Ecco una gif che mostra una dimostrazione dell'utilizzo di @
come delimitatore invece di /
.
Conclusione
La sostituzione del testo può essere un'occorrenza comune e Vim ti offre un modo potente per cercare e sostituire pattern con una stringa. Puoi anche mescolare regex nel comando di sostituzione di Vim.
Se sei interessato a imparare qualcosa di più delle semplici basi di Vim, ti consiglio vivamente di usare questo programma di Jovica Ilic.