Eu posso usar
:5,12s/foo/bar/g
para procurar fooe substituí-lo por barentre as linhas 5 e 12. Como posso fazer isso apenas na linha 5 e 12 (e não nas linhas intermediárias)?
Respostas:
O Vim tem átomos de expressão regular especiais que correspondem em certas linhas, colunas, etc .; você pode usá-los (possivelmente além do intervalo) para limitar as correspondências:
:5,12s/\(\%5l\|\%12l\)foo/bar/g
Vejo :help /\%l
Você pode fazer a substituição na linha 5 e repeti-la com o mínimo de esforço na linha 12:
:5s/foo/bar
:12&
Conforme apontado por Ingo, :&esquece suas bandeiras. Já que você está usando /g, o comando correto seria :&&:
:5s/foo/bar/g
:12&&
Veja :help :&e amigos.
:&em uso. Se houver sinalizadores ( s/../../g), será necessário usar :&&, no entanto ...
\(\%5l\|\%12l\)é mais obscuro do que:&
Você sempre pode adicionar um cao final. Isso pedirá confirmação para cada partida.
:5,12s/foo/bar/gc
gbandeira em jogo)
n5 ou 6 vezes é mais oneroso do que adicionar \(\%5l\|\%12l\)à instrução substituta?
Pergunta interessante. Parece que há apenas seleção de intervalo e nenhuma seleção de linha múltipla:
http://vim.wikia.com/wiki/Ranges
No entanto, se você tiver algo especial nas linhas 5 e 12, poderá usar a :goperadora. Se o seu arquivo for assim (números apenas para referência):
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 você deseja substituir onepor enonas linhas onde há em enilvez de line:
:g/enil/s/one/eno/
Você poderia usar ed- um editor de texto orientado a linhas com comandos semelhantes ao vi e vim. Provavelmente é anterior ao vi e vim.
Em um script (usando um documento here que processa a entrada até o marcador EndCommand) seria semelhante a:
ed file <<EndCommands
5
s/foo/bar/g
7
s/foo/bar/g
wq
EndCommands
Obviamente, os comandos ed também podem ser usados na linha de comando.
vimalternativa.
:s, mas ainda há a duplicação do :scomando (que a solução de romainl evita).
sed, porém ...