risposta-alla-domanda-sullo-sviluppo-web-bd.com

Trova e sostituisci le stringhe su vim su più righe

Posso fare :%s/<search_string>/<replace_string>/g per sostituire una stringa su un file, o :s/<search_string>/<replace_string>/ per sostituire nella riga corrente.

Come posso selezionare e sostituire parole da linee selettive in vim?

Esempio: sostituire il testo dalle righe 6-10, 14-18 ma non da 11-13.

245
mu 無

Il comando :&& ripete l'ultima sostituzione con gli stessi flag. Puoi fornire gli intervalli aggiuntivi (e concatenare quanti ne vuoi):

:6,10s/<search_string>/<replace_string>/g | 14,18&&

Se hai molti intervalli anche se preferisco usare un ciclo:

:for range in split('6,10 14,18')| exe range 's/<search_string>/<replace_string>/g' | endfor
193
Ingo Karkat

Sostituisci tutto:

:%s/foo/bar/g

Trova ogni occorrenza di "pippo" (in tutte le righe) e sostituiscila con "bar".

Per linee specifiche:

:6,10s/foo/bar/g

Cambia ogni "pippo" in "barra" per tutte le linee dalla riga 6 alla riga 10 incluse.

259

Come nota a margine, invece di dover digitare i numeri di riga, è sufficiente evidenziare le linee in cui si desidera trovare/sostituire in una delle modalità visive:

  • VISUAL modalità (V)
  • VISUAL BLOCK modalità (Ctrl+V)
  • VISUAL LINE modalità (Shift+V, funziona meglio nel tuo caso)

Dopo aver selezionato le linee da sostituire, digita il comando:

:s/<search_string>/<replace_string>/g

Noterai che l'intervallo '<,'> verrà inserito automaticamente per te:

:'<,'>s/<search_string>/<replace_string>/g

Qui '< significa semplicemente prima riga evidenziata , e '> significa ultima riga evidenziata .

Si noti che il comportamento potrebbe essere inaspettato quando in NORMAL modalità: '< e '> puntano all'inizio e alla fine dell'ultima evidenziazione eseguita in una delle modalità VISUAL. Invece, nella modalità NORMAL, è possibile utilizzare il numero di riga speciale ., che significa semplicemente riga corrente . Quindi, puoi trovare/sostituire solo sulla riga corrente in questo modo:

:.s/<search_string>/<replace_string>/g

Un'altra cosa da notare è che l'inserimento di un secondo : tra l'intervallo e il comando find/replace non danneggia, in altre parole, questi comandi funzioneranno ancora:

:'<,'>:s/<search_string>/<replace_string>/g
:.:s/<search_string>/<replace_string>/g
45
Attila O.

Puoi farlo con due sequenze di ricerca/sostituzione

  :6,10s/<search_string>/<replace_string>/g
  :14,18s/<search_string>/<replace_string>/g

La seconda volta tutto ciò che devi regolare è l'intervallo, quindi invece di digitare tutto, vorrei richiamare l'ultimo comando e modificare solo l'intervallo

27

VI cerca e sostituisci esempi di comandi

Supponiamo che tu voglia trovare una parola chiamata "foo" e sostituirla con "bar".

Primo colpo [Esc] chiave

Digitare: (due punti) seguito da %s/foo/bar/ e premere il tasto [Invio]

:%s/foo/bar/

11
arnav

In vim se sei confuso su tutte le linee interessate, usa sotto 

 :%s/foo/bar/gc  

Cambia ogni 'pippo' in 'bar', ma chiedi conferma prima . Premi 'y' per sì e 'n' per no. Non dimenticare di salvare dopo

:wq
8
SMJ

Non abbiamo bisogno di preoccuparci di inserire il numero di linea corrente. 

Se si desidera modificare ogni foo a bar per la riga corrente (.) e le due righe successive (+2), fare semplicemente:

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

Se si desidera confermare prima che vengano apportate modifiche, sostituire g con gc

:.,+2s/foo/bar/gc
3
andykong10

Specificare l'intervallo attraverso la selezione visiva è ok ma quando ci sono molte semplici operazioni su un paio di linee che possono essere selezionate da un operatore La cosa migliore sarebbe applicare questi comandi come operatori.

Questo purtroppo non può essere fatto attraverso i comandi standard di vim. Si potrebbe fare una sorta Di soluzione utilizzando il! (filtro) operatore e qualsiasi oggetto di testo. Per esempio., Per applicare l'operazione a un paragrafo, puoi fare:

!ip

Questo deve essere letto come "Applicare l'operatore! All'interno di un paragrafo". L'operatore filtro Avvia la modalità comando e inserisce automaticamente l'intervallo di righe Seguito da un letterale "!" che è possibile eliminare solo dopo . Se si applica questo, al seguente paragrafo:

1
2  Repellendus qui velit vel ullam!
3  ipsam sint modi! velit ipsam sint
4  modi! Debitis dolorum distinctio
5  mollitia vel ullam! Repellendus qui
6  Debitis dolorum distinctio mollitia
7  vel ullam! ipsam
8
9  More text around here

Il risultato dopo aver premuto "! Ap" sarebbe come:

:.,.+5

Come il '.' (punto) indica la linea corrente, l'intervallo tra la linea corrente e le 5 righe dopo verrà utilizzato per l'operazione. Ora puoi aggiungere Il comando sostitutivo allo stesso modo di prima.

La parte cattiva è che non è più semplice selezionare il testo per quest'ultimo Applicando l'operatore. La buona parte è che questo può ripetere l'inserimento Dell'intervallo per altri intervalli di testo simili (in questo caso, paragrafi) con Dimensioni diverse a seconda della vista. Ad esempio, se in un secondo momento si desidera selezionare l'intervallo più grande Il paragrafo '.' lo farò bene.

Inoltre, se ti piace l'idea di usare oggetti di testo semantico per selezionare l'intervallo di operazioni , Puoi controllare my plugin EXtend.vim che può fare lo stesso Ma in modo più semplice .