Eu posso usar
:5,12s/foo/bar/g
para procurar foo
e substituí-lo por bar
entre as linhas 5 e 12. Como posso fazer isso apenas na linha 5 e 12 (e não nas linhas intermediárias)?
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:
Conforme apontado por Ingo,
:&
esquece suas bandeiras. Já que você está usando/g
, o comando correto seria:&&
:Veja
:help :&
e amigos.fonte
:&
em uso. Se houver sinalizadores (s/../../g
), será necessário usar:&&
, no entanto ...\(\%5l\|\%12l\)
é mais obscuro do que:&
Você sempre pode adicionar um
c
ao final. Isso pedirá confirmação para cada partida.fonte
g
bandeira em jogo)n
5 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
:g
operadora. Se o seu arquivo for assim (números apenas para referência):E você deseja substituir
one
poreno
nas linhas onde há emenil
vez deline
:fonte
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:
Obviamente, os comandos ed também podem ser usados na linha de comando.
fonte
vim
alternativa.:s
, mas ainda há a duplicação do:s
comando (que a solução de romainl evita).sed
, porém ...