posso usare
:5,12s/foo/bar/g
per cercarlo fooe sostituirlo con bartra le righe 5 e 12. Come posso farlo solo nelle righe 5 e 12 (e non nelle righe intermedie)?
Risposte:
Vim ha atomi di espressioni regolari speciali che corrispondono in determinate righe, colonne, ecc .; puoi usarli (possibilmente in aggiunta al range) per limitare gli abbinamenti:
:5,12s/\(\%5l\|\%12l\)foo/bar/g
Vedere :help /\%l
Puoi eseguire la sostituzione sulla riga 5 e ripeterla con il minimo sforzo sulla riga 12:
:5s/foo/bar
:12&
Come sottolineato da Ingo, :&dimentica le tue bandiere. Dato che stai usando /g, il comando corretto sarebbe :&&:
:5s/foo/bar/g
:12&&
Vedi :help :&e amici.
:&da usare. Se ci sono flag ( s/../../g), bisogna usare :&&, però ...
\(\%5l\|\%12l\)sia più oscuro di:&
Puoi sempre aggiungere un calla fine. Questo chiederà conferma per ogni partita.
:5,12s/foo/bar/gc
gbandiera in gioco)
n5 o 6 volte sia più oneroso che aggiungere \(\%5l\|\%12l\)all'istruzione sostitutiva?
Domanda interessante. Sembra che ci sia solo la selezione dell'intervallo e nessuna selezione di più righe:
http://vim.wikia.com/wiki/Ranges
Tuttavia, se hai qualcosa di speciale sulle righe 5 e 12, potresti usare l' :goperatore. Se il tuo file ha questo aspetto (numeri solo per riferimento):
1 line one
2 line one
3 line one
4 line one
5 enil one
6 line one
7 line one
8 line one
9 line one
10 line one
11 line one
12 enil one
E vuoi sostituire onecon enosulle righe dove c'è enilinvece di line:
:g/enil/s/one/eno/
Potresti usare ed- un editor di testo orientato alla riga con comandi simili a vi e vim. Probabilmente è precedente a vi e vim.
In uno script (utilizzando un here document che elabora l'input fino al marker EndCommand) sarebbe simile a:
ed file <<EndCommands
5
s/foo/bar/g
7
s/foo/bar/g
wq
EndCommands
Ovviamente, i comandi ed possono essere usati anche dalla riga di comando.
vimsull'alternativa.
:s, ma c'è ancora la duplicazione del :scomando (che la soluzione di romainl evita).
sed, però ...