Pesquise e substitua

Dica 31 Monobook para impressão Anterior Próximo

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/gEncontre cada ocorrência de “foo” (apenas na linha atual) e substitua-a por “bar “:%s/foo/bar/gEncontre cada ocorrência de “foo” (em todas as linhas) e substitua-a por “bar”.:%s/foo/bar/gcAltere cada “foo” para “bar”, mas peça a confirmação primeiro.:%s/\<foo\>/bar/gcAltere apenas palavras inteiras que correspondam exatamente a “foo” para “bar”; peça confirmação.:%s/foo/bar/gciAltere 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\ctorna a pesquisa insensível a maiúsculas e minúsculas. Isso pode ser desejado depois de usar:set noignorecasepara fazer pesquisas com distinção entre maiúsculas e minúsculas (o padrão).:%s/foo/bar/gcIAltere 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\Ctorna a pesquisa sensível a maiúsculas e minúsculas. Isso pode ser desejado após usar:set ignorecasepara 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 comcorresponde 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).\0insere o texto que corresponde a todo o padrão\1insere o texto da primeira referência anterior.\2insere 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/gSubstitua cada correspondência do último padrão de pesquisa por “bar”. Por exemplo, você pode primeiro colocar o cursor na palavrafooe, 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>/gSubstitua 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>/gSubstitua 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/gSubstitua cada ocorrência de “foo” pelo conteúdo do registro “a”.<c-r>asignifica 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/gO 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/gSubstitua 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>//gSubstitua 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/gSubstitua 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/gSubstitua todas as ocorrências do texto no registro “a” por “bar”.<c-r>asignifica 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^Me não são encontradas. A pesquisa funciona se cada

^Mfor 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/gO"\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/gO 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\>//gEm 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/gEm 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)/gObtenha uma lista dos resultados da pesquisa. (a lista deve existir) Define o sinalizadormodifiedpor 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))/gnIsso 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/gSubstitua “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)

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *