Eu posso fazer :%s/<search_string>/<replace_string>/g
substituindo uma string em um arquivo ou :s/<search_string>/<replace_string>/
substituindo na linha atual.
Como posso selecionar e substituir palavras de linhas seletivas no vim?
Exemplo: substitua o texto das linhas 6-10
, 14-18
mas não de 11-13
.
Respostas:
O
:&&
comando repete a última substituição com os mesmos sinalizadores. Você pode fornecer os intervalos adicionais (e concatenar quantos quiser):Se você tiver muitos intervalos , prefiro usar um loop:
fonte
:6,10s/<search_string>/<replace_string>/g | :14,18&& | :20,23&& | :28,31&&
também funcionará, ofor
loop facilita a lembrança e a execução.:
comandos subsequentes são opcionais, btw, para que você possa salvar mais algumas teclas.:&&
economizará centenas de pressionamentos de tecla por semana. Obrigado!Substitua tudo:
Encontre cada ocorrência de 'foo' (em todas as linhas) e substitua-a por 'bar'.
Para linhas específicas:
Mude cada 'foo' para 'bar' para todas as linhas da linha 6 para a linha 10 inclusive.
fonte
/
, é onde você indica sinalizadores para a operação. Este comando normalmente substitui a primeira correspondência em uma linha; Com ag
bandeira, ela substituirá todas as ocorrências.%
coisa faz o trabalho! Caso contrário, é apenas a primeira ocorrência.%
=> execute este comando em todas as linhas.g
=> corresponde a várias ocorrências na mesma linha.Como observação lateral, em vez de precisar digitar os números das linhas, apenas destaque as linhas nas quais deseja encontrar / substituir em um dos modos visuais:
VISUAL
mode ( V)VISUAL BLOCK
modo ( Ctrl+ V)VISUAL LINE
modo ( Shift+ V, funciona melhor no seu caso)Depois de selecionar as linhas a serem substituídas, digite seu comando:
Você notará que o intervalo
'<,'>
será inserido automaticamente para você:Aqui
'<
significa simplesmente primeira linha destacada , e'>
meios última linha destacada .Observe que o comportamento pode ser inesperado quando está no
NORMAL
modo:'<
e'>
aponte para o início e o fim do último destaque realizado em um dosVISUAL
modos. Em vez disso, noNORMAL
modo, o número da linha especial.
pode ser usado, o que significa simplesmente linha atual . Portanto, você pode encontrar / substituir apenas na linha atual como esta:Outra coisa a ser observada é que inserir um segundo
:
entre o intervalo e o comando find / replace não faz mal, ou seja, esses comandos ainda funcionarão:fonte
Você pode fazer isso com duas seqüências de localização / substituição
A segunda vez que tudo que você precisa ajustar é o intervalo. Em vez de digitar tudo, eu lembraria do último comando e editaria apenas o intervalo
fonte
No vim, se você estiver confuso de que todas as linhas serão afetadas, use abaixo
Mude cada 'foo' para 'bar', mas peça primeiro a confirmação. Pressione 'y' para sim e 'n' para não. Não se esqueça de salvar depois disso
fonte
c
sinalizador, além de especificar o intervalo, assim:6,10s/<search_string>/<replace_string>/c
funciona.c
significaconfirm
. Uso ac
bandeira com bastante frequência para impedir a substituição acidental de palavras em que não pensei que elas existissem também.Exemplos de Comando de Procura e Substituição do VI
Digamos que você gostaria de encontrar uma palavra chamada "foo" e substituir por "bar".
Primeira
[Esc]
tecla pressionadaDigite: (dois pontos) seguido por
%s/foo/bar/
e pressione a tecla [Enter]:%s/foo/bar/
fonte
:%s/<search_string>/<replace_string>/g
comando substituirá todas as ocorrências no arquivo inteiro. Não é exatamente a resposta para a pergunta, mas é útil, no entanto :) :) #Não precisamos nos preocupar em digitar o número da linha atual.
Se você gostaria de mudar cada
foo
parabar
a linha atual (.
) e as duas próximas linhas (+2
), basta fazer:Se você deseja confirmar antes que as alterações sejam feitas, substitua
g
porgc
:fonte
:.,$s/foo/bar/gc
pesquisar e substituir, começando da linha atual até o final do arquivo.Pesquisar e substituir
g => pesquisa global
c => Peça confirmação primeiro
i => Não diferencia maiúsculas de minúsculas
Se você deseja substituição direta sem confirmação, use o comando abaixo
Se você deseja confirmação para cada substituição, execute o comando abaixo
Peça a confirmação primeiro, aqui a pesquisa não diferencia maiúsculas de minúsculas.
fonte
A especificação do intervalo por meio da seleção visual é aceitável, mas quando houver operações muito simples em apenas algumas linhas que podem ser selecionadas por um operador, o melhor seria aplicar esses comandos como operadores.
Infelizmente, isso não pode ser feito por meio de comandos padrão do vim. Você pode fazer uma espécie de solução alternativa usando o! operador (filtro) e qualquer objeto de texto. Por exemplo, para aplicar a operação a um parágrafo, você pode:
Isso deve ser lido como "Aplique o operador! Dentro de um parágrafo". O operador de filtro inicia o modo de comando e insere automaticamente o intervalo de linhas seguido por um literal "!" que você pode excluir logo depois. Se você aplicar isso, ao seguinte parágrafo:
O resultado depois de pressionar "! Ap" seria como:
Enquanto o '.' (ponto) significa a linha atual, o intervalo entre a linha atual e as 5 linhas seguintes será usado para a operação. Agora você pode adicionar o comando substituto da mesma maneira que anteriormente.
A parte ruim é que isso não é mais fácil do que selecionar o texto para a última aplicação do operador. A parte boa é que isso pode repetir a inserção do intervalo para outros intervalos de texto semelhantes (neste caso, parágrafos) com tamanho bastante diferente. Ou seja, se mais tarde você quiser selecionar o parágrafo maior do intervalo, o '.' vontade para isso certo.
Além disso, se você gosta da ideia de usar objetos de texto semântico para selecionar o intervalo de operação, pode verificar meu plug-in EXtend.vim, que pode fazer o mesmo, mas de uma maneira mais fácil.
fonte
Para responder a esta pergunta:
:40,50s/foo/bar/g
substitua foo por barra nessas linhas entre a 40ª e a 50ª linha (inclusive), quando executar este comando, você poderá atualmente em qualquer linha.
:50,40s/foo/bar/g
também funciona, o vim solicitará que você confirme e faça a substituição como se tivesse inserido o primeiro comando.
:,50s/foo/bar/g
substitua foo por barra nessas linhas entre a linha em que você está atualmente e a 50ª linha (inclusive). (se você estiver em uma linha APÓS o 50º linha vim solicitará confirmação novamente)
Para esclarecer a diferença entre o vim e o plug-in vrapper do Eclipse:
Observe que no varpper
:,50s/foo/bar/g
comando NÃO funcionará.:50,40s/foo/bar/g
funcionará sem pedir confirmação.(Para Vrapper versão 0.74.0 ou anterior).
fonte
Suponha que você queira substituir o acima por outras informações.
COMMAND(:%s/\/sys\/sim\/source\/gm\/kg\/jl\/ls\/owow\/lsal/sys.pkg.mpu.umc.kdk./g)
Neste, o acima será substituído por (
sys.pkg.mpu.umc.kdk.
).fonte
%s
a modificação de entrada, mas quer saber como fazê-la "semi-globalmente" (ou seja, sua especificação é as linhas 6-10 e 14-18, mas não nas linhas 11- 13)/
, por exemplo!
,@
,_
::%s_/sys/sim/source/gm/kg/jl/ls/owow/lsal_sys.pkg.mpu.umc.kdk_g