criado em 2001 · complexidade básica · versão 6.0
O Vim fornece o :s
(substituir) comando para pesquisar e substituir; esta dica mostra exemplos de como substituir. Em alguns sistemas, gvim tem Localizar e Substituir no menu Editar (: help: promptrepl), no entanto, é mais fácil usar o comando :s
devido ao seu histórico de linha de comando e capacidade de inserir texto (por exemplo, a palavra sob o cursor) nos campos de pesquisa ou substituição.
Pesquisa básica e substituição
O comando :substitute
procura um padrão de texto e o substitui por uma string de texto. Existem muitas opções, mas provavelmente você deseja:
:s/foo/bar/g
Encontre cada ocorrência de “foo” (apenas na linha atual) e substitua-a por “bar “:%s/foo/bar/g
Encontre cada ocorrência de “foo” (em todas as linhas) e substitua-a por “bar”.:%s/foo/bar/gc
Altere cada “foo” para “bar”, mas peça a confirmação primeiro.:%s/\<foo\>/bar/gc
Altere apenas palavras inteiras que correspondam exatamente a “foo” para “bar”; peça confirmação.:%s/foo/bar/gci
Altere cada “foo” (não diferencia maiúsculas de minúsculas devido ao sinalizadori
) para “bar”; peça confirmação.:%s/foo\c/bar/gc
é o mesmo porque\c
torna a pesquisa insensível a maiúsculas e minúsculas. Isso pode ser desejado depois de usar:set noignorecase
para fazer pesquisas com distinção entre maiúsculas e minúsculas (o padrão).:%s/foo/bar/gcI
Altere cada “foo” (diferencia maiúsculas de minúsculas devido ao sinalizadorI
) para “bar”; peça confirmação.:%s/foo\C/bar/gc
é o mesmo porque\C
torna a pesquisa sensível a maiúsculas e minúsculas. Isso pode ser desejado após usar:set ignorecase
para tornar as pesquisas insensíveis a maiúsculas e minúsculas.
O sinalizador g
significa global – cada ocorrência na linha é alterada, ao invés de apenas a primeira. Esta dica assume a configuração padrão para a opção "gdefault"
e "edcompatible"
(desativada), que requer que a g
sinalizador seja incluído em %s///g
para realizar uma substituição global. Usar :set gdefault
cria confusão porque então %s///
é global, enquanto %s///g
não é (isto é , g
inverte seu significado).
Ao usar o sinalizador c
, você precisa confirmar para cada correspondência o que façam. O Vim produzirá algo como: replace with foobar (y/n/a/q/l/^E/^Y)?
(onde foobar é a parte de substituição do comando :s/.../.../
. Você pode digitar y
que significa substituir esta correspondência, n
para pular esta correspondência, a
para substituir esta e todas as correspondências restantes ( “todas” correspondências restantes), q
para sair do comando, l
para substituir essa correspondência e sair (pense em “último”), ^E
para rolar a tela para cima segurando a tecla Ctrl e pressionando E e ^Y
para rolar a tela para baixo, segurando a tecla Ctrl e pressionando Y. No entanto, as duas últimas opções estão disponíveis apenas se o seu Vim for normal, grande ou enorme, ou se o recurso insert_expand foi habilitado em tempo de compilação (procure +insert_expand
na saída de :version
).
Além disso, ao usar o sinalizador c
, o Vim pulará para t A primeira correspondência que ele encontra começando do topo do buffer e solicita uma confirmação para realizar a substituição nessa correspondência. O Vim aplica o IncSearch
grupo de realce ao texto correspondido para lhe dar uma indicação visual de em qual partida ele está operando (definido como reverse
por padrão para todos os três tipos de termos a partir do Vim 7.3). Além disso, se mais de uma correspondência for encontrada e você tiver o realce de pesquisa habilitado com :set hlsearch
, o Vim realçará as correspondências restantes com o Search
grupo de realce . Se você usar o realce de pesquisa, certifique-se de que esses dois grupos de realce sejam visualmente distintos ou você não conseguirá dizer facilmente qual correspondência o Vim está solicitando que você substitua.
Detalhes
Faixa de pesquisa:
Observação: a partir do Vim 7.3, as substituições aplicadas a uma faixa definida por marcas ou uma seleção visual (que usa um tipo especial de marcas “< e “>) não são limitados pela posição da coluna das marcas por padrão. Em vez disso, o Vim aplica a substituição a toda a linha em que cada marca aparece, a menos que\%V
átomo é usado no padrão como::"<,">s/\%Vfoo/bar/g
.
Ao pesquisar:
.
,*
,\
,especifica uma coleção /. Os intervalos de caracteres podem ser representados com um
-
; por exemplo, uma letra a, b, c ou o número 1 podem ser combinados com. Negar a coleção com
corresponde a qualquer caractere, exceto a, b, c ou 1.
\{#\}
é usado para repetição./foo.\{2\}
corresponderá a foo e os dois caracteres a seguir. O\
não é necessário no fechamento}
, portanto,/foo.\{2}
fará a mesma coisa.\(foo\)
faz uma referência anterior a foo. Parênteses sem escapes são literalmente correspondidos. Aqui, o\
é necessário para o fechamento\)
.
Ao substituir:
\r
é nova linha,\n
é um byte nulo (0x00).\&
é e comercial (& é o texto que corresponde ao padrão de pesquisa).\0
insere o texto que corresponde a todo o padrão\1
insere o texto da primeira referência anterior.\2
insere a segunda referência anterior e assim por diante.
Você pode usar outros delimitadores com substituto:
:s#http://www.example.com/index.html#http://example.com/#
Salve a digitação usando \zs
e \ze
para definir o início e o fim de um padrão. Por exemplo, em vez de:
:s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Reserved/
Use:
:s/Copyright \zs2007\ze All Rights Reserved/2008/
Usando a palavra atual ou registradores
:%s//bar/g
Substitua cada correspondência do último padrão de pesquisa por “bar”. Por exemplo, você pode primeiro colocar o cursor na palavrafoo
e, em seguida, pressionar*
para pesquisar essa palavra. O substituto acima mudaria todas as palavras que correspondessem exatamente a “foo” para “bar”.:%s/foo/<c-r><c-w>/g
Substitua cada ocorrência de “foo” pela palavra sob o cursor.<c-r><c-w>
significa que você pressiona Ctrl-R e depois Ctrl-W. A palavra sob o cursor será inserida como se você a tivesse digitado.:%s/foo/<c-r><c-a>/g
Substitua cada ocorrência de “foo” pela PALAVRA sob o cursor (delimitada por um espaço em branco).<c-r><c-a>
significa que você pressiona Ctrl-R e depois Ctrl-A. A PALAVRA sob o cursor será inserida como se você a tivesse digitado.:%s/foo/<c-r>a/g
Substitua cada ocorrência de “foo” pelo conteúdo do registro “a”.<c-r>a
significa que você pressiona Ctrl-R ea
. O conteúdo do registro “a” será inserido como se você o tivesse digitado.:%s/foo/<c-r>0/g
O mesmo que acima, usando o registro 0 que contém o texto do comando de arrancar mais recente. Exemplos de comandos yank (copiar) sãoyi(
que copia o texto entre parênteses ao redor do cursor ey$
que copia o texto do cursor até o final da linha. Após um comando de arrancar que não especificou um registro de destino, o texto copiado pode ser inserido pressionando Ctrl-R e0
.:%s/foo/\=@a/g
Substitua cada ocorrência de “foo” pelo conteúdo do registro “a”.\=@a
é uma referência para registrar “a”. O conteúdo do registro “a” não é mostrado no comando. Isso é útil se o registro contém muitas linhas de texto.:%s//<c-r>//g
Substitua cada correspondência do último padrão de pesquisa pelo registro/
(o último padrão de pesquisa). Depois de pressionar Ctrl-R e/
para inserir o último padrão de pesquisa (e antes de pressionar Enter para executar o comando), você pode editar o texto para fazer qualquer alteração necessária.:%s/<c-r>*/bar/g
Substitua todas as ocorrências do texto na área de transferência do sistema (no registro*
) por “bar” (veja o próximo exemplo se houver várias linhas) . Em alguns sistemas, selecionar o texto (no Vim ou em outro aplicativo) é tudo o que é necessário para colocar esse texto no registro*
.:%s/<c-r>a/bar/g
Substitua todas as ocorrências do texto no registro “a” por “bar”.<c-r>a
significa que você pressiona Ctrl-R ea
. O conteúdo do registro “a” será inserido como se você o tivesse digitado. Quaisquer novas linhas no registro “a” são inseridas como^M
e não são encontradas. A pesquisa funciona se cada
^M
for substituído manualmente por “\ n” (dois caracteres: barra invertida, “n”). Esta substituição pode ser realizada enquanto você digita o comando::%s/<c-r>=substitute(@a,"\n","\\n","g")<CR>/bar/g
O"\n"
(aspas duplas) representa a nova linha de caractere único; o"\\n"
(aspas simples) representa duas barras invertidas seguidas por “n
“.A funçãosubstitute()
é avaliada pelo registrador de expressão<c-r>=
(Ctrl-R=
); ele substitui cada nova linha por uma única barra invertida seguida por “n
“. O<CR>
indica que você pressiona Enter para concluir a expressão=
.:%s/<c-r>0/bar/g
O mesmo que acima, usando o registro 0 que contém o texto do comando de arrancar mais recente.
Consulte Colar registros em comandos de pesquisa ou dois-pontos em vez de usar a área de transferência.
Exemplos adicionais
:%s/foo/bar/
Em cada linha, substitua a primeira ocorrência de “foo” com “bar”.:%s/.*\zsfoo/bar/
Em cada linha, substitua a última ocorrência de “foo” por “bar”.:%s/\<foo\>//g
Em cada linha, exclua todas as ocorrências da palavra “foo”.:%s/\<foo\>.*//
Em cada linha, exclua a palavra “foo” inteira e todo o texto seguinte (até o final da linha).:%s/\<foo\>.\{5}//
Em cada linha, exclua a primeira ocorrência da palavra “foo” inteira e os cinco caracteres a seguir.:%s/\<foo\>\zs.*//
Em cada linha, exclua todo o texto após a palavra “foo” (até o final da linha).:%s/.*\<foo\>//
Em cada linha, exclua a palavra “foo” inteira e todo o texto anterior (do início da linha).:%s/.*\ze\<foo\>//
Em cada linha, exclua todo o texto que precede a palavra “foo” (do início da linha).:%s/.*\(\<foo\>\).*/\1/
Em cada linha, exclua todo o texto anterior e posterior à palavra “foo”.:%s/\<foo\(bar\)\@!/toto/g
Em cada linha, substitua cada ocorrência de “foo” (que inicia uma palavra e não é seguida por “bar”) por “toto”.:s/^\(\w\)/\u\1/
Se o primeiro caractere no início da linha atual estiver apenas em minúsculas, mude para maiúsculas usando\u
(consulte a troca de maiúsculas e minúsculas ):%s/\(.*\n\)\{5\}/&\r/
Insira uma linha em branco a cada 5 linhas. O padrão procura por\(.*\n\)
(qualquer linha incluindo seu final) repetido cinco vezes (\{5\}
). A substituição é&
(o texto que foi encontrado), seguido por\r
(nova linha).:%s/\<foo\(\a*\)\>/\=len(add(list, submatch(1)))?submatch(0):submatch(0)/g
Obtenha uma lista dos resultados da pesquisa. (a lista deve existir) Define o sinalizadormodified
por causa da substituição, mas o conteúdo permanece inalterado. Nota: Com um Vim recente o suficiente (versão 7.3.627 ou superior), você pode simplificar para:
:%s/\<foo\(\a*\)\>/\=add(list, submatch(1))/gn
Isso tem a vantagem de que o buffer não será marcado como modificado e não é criado um estado de desfazer extra. A expressão na peça de substituição é executada na sandbox e não tem permissão para modificar o buffer.
Casos especiais
Para substituir padrões com o texto correspondente com distinção entre maiúsculas e minúsculas, Michael Geddes ” O plugin keepcase s pode ser usado, por exemplo:
:%SubstituteCase/\cHello/goodBye/g
Substitua “Hello hello helLo HELLO” por “Goodbye goodbye goodBye GOODBYE”
Para alterar os offsets em um arquivo de patch (número da linha de um bloco), este pequeno trecho pode ser usado:
s/^@@ -\(\d\+\),\(\d\+\) +\(\d\+\),\(\d\+\) @@$/\="@@ -".eval(submatch(1)+offsetdiff).",".submatch(2)." +".eval(submatch(3)+offsetdiff).",".submatch(4)." @@"/g
Útil quando queremos remover alguns blocos de um patch, sem que o patch tenha que reclame sobre diferenças de deslocamento.
Nota Deve-se tentar tornar a expressão mais compacta, mas não sei como sem ter a possibilidade de modificar linhas indesejadas.
Veja também: usando substituto
- 63 Aplicar substitutos a um bloco visual
- 81 Substituir caracteres e linhas facilmente
- 159 Salvar pressionamento de tecla Substituir e pesquisar
- 406 Delimitadores alternativos para substituir comando
- 438 Pesquisar e substituir em uma seleção visual
- 464 Pesquisar e substituir a palavra sob o cursor
- 479 Substituir sem digitar
- 573 Repetição de um substituto da posição atual do cursor
- 605 Substitua uma palavra pelo texto arrancado
- 654 caracteres especiais no comando de substituição
- 755 Usando uma expressão em substitute command
- 808 Substitua um bloco visual de texto por outro bloco
- 915 Usando g em vez de substitute
- 971 Substitua com números incrementais
- 1114 Etapa incremento e substituição
- 1501 Substituir última pesquisa
Veja também: substituir em buffers / arquivos
- 382 Pesquisa e substitua em vários buffers
- : help: substitute
- : help cmdline-r anges
- : padrão de ajuda
- : help “gdefault”
- : registros de ajuda
PARA FAZER
O uma grande seção “veja também” pode ser útil para os leitores. Precisamos mesclar algumas das dicas relacionadas (mas não torne o resultado muito complexo). Eu incluí os números das dicas para ajudar os editores a acompanhar.
Quer uma seção curta mencionando que substitutos simples são geralmente os melhores tratado pesquisando e alterando manualmente (e pressionando .
para repetir a última alteração). Além disso, você pode decidir como alterar cada instância.Consulte Copiar ou alterar o resultado da pesquisa para uma técnica em que você pode pressionar n
para encontrar a próxima instância e, em seguida, digite cs
para alterar o resultado da pesquisa para qualquer coisa.
Houve alguma mudança recentemente na forma como% s funciona? De alguma forma, posso usar < cr > e \ = @ como substitutos, mas não posso “usá-los como pesquisas e substituições.
Se você descrever exatamente o que você faz e o que acontece, posso ser capaz de ajudar, embora veja fazendo perguntas. JohnBeckett (conversa) 02:15, 1 de junho de 2019 (UTC)