Pesquise por string e obtenha a contagem no editor vi

105

Quero pesquisar uma string e encontrar o número de ocorrências em um arquivo usando o editor vi.

Cadespa
fonte
11
A resposta selecionada ( :g/xxxx/d) é terrível, perigosa e inferior a outras nesta página. Desmarque-o.
Bruno Bronosky
1
Eu concordo e só informa 'linhas excluídas' e não 'ocorrências excluídas'
usuário1709076

Respostas:

4
:g/xxxx/d

Isso excluirá todas as linhas com padrão e relatará quantas foram excluídas. Desfaça para recuperá-los depois.

Kevin beck
fonte
6
Claro, ele pode simplesmente omitir o "d" para não precisar fazer a operação.
Torre,
15
Observe que isso apenas informa quantas linhas - não quantas ocorrências. Eu acho que o Dirk's é a melhor solução.
4
Minha solução abaixo conta corretamente várias ocorrências em uma linha e não há nada para desfazer.
Mohit Chakraborty,
6
Muito perigoso: o
Ankit Zalani
1
Essa não deve ser a resposta aceita / mais popular. O que os moderadores do SO estão fazendo? :(
user1412066
181

O jeito é

:% s / padrão // gn

Gustavo
fonte
2
Esta é a resposta mais autêntica sem nenhum truque de over-kill usado.
user1412066
1
a melhor resposta!
Paulo Luvisoto
121

Você precisa da nbandeira. Para contar palavras, use:

:%s/\i\+/&/gn   

e uma palavra particular:

:%s/the/&/gn        

Consulte a count-itemsseção de documentação.

Se você simplesmente digitar:

%s/pattern/pattern/g

então a linha de status fornecerá o número de correspondências no vi também.

diretamente
fonte
Parece que esta resposta é para usuários do Vim e não para o Vi :(
kadeshpa,
Você só tem vi em seu sistema? Qual versão?
diretamente em
Alguém marcou seu quesiton com vim nele ... Eu o removi.
ojblass,
38

:% s / string / string / g dará a resposta.

Mohit Chakraborty
fonte
Que resposta melhor. +5 se possível
ojblass
Eu acho que funcionaria apenas quando nenhum '. *' For usado no padrão
AK
10
Não há necessidade de repetir a corda, apenas faça %s/string//ng.
slm
23

(parecido com o que o Gustavo disse, mas além disso:)

Para qualquer pesquisa anterior , você pode fazer simplesmente:

:%s///gn

Um padrão não é necessário, porque ele já está no registro de pesquisa ( @/).

"%" - faz s/em todo o arquivo
"g" - pesquisa global (com vários resultados em uma linha)
"n" - impede qualquer substituição de s/- nada é excluído! nada deve ser desfeito!
(veja: :help s_flagpara mais informações)

(Desta forma, funciona perfeitamente com " Pesquisar texto selecionado visualmente ", conforme descrito em vim-wikia tip171 )

tron5
fonte
3

usar

:% s / padrão / \ 0 / g

quando a string do padrão é muito longa e você não gosta de digitar tudo de novo.

Sungwon Jeong
fonte
1

Resposta curta :

:% s / string a ser pesquisada // gn

Para aprender :

Existem 3 modos no editor de VI como abaixo insira a descrição da imagem aqui

  • :você está entrando Commandno Command-linemodo para . Agora, tudo o que você escreve depois :está na CLI (Command Line Interface)
  • %sespecifica todas as linhas. Especificar o intervalo como %significa fazer a substituição em todo o arquivo. A sintaxe para todas as substituições de ocorrências é:%s/old-text/new-text/g
  • gespecifica todas as ocorrências na linha. Com a gbandeira, você pode fazer com que toda a linha seja substituída. Se este gsinalizador não for usado, apenas a primeira ocorrência na linha será substituída.
  • n especifica a saída do número de ocorrências
  • //barra dupla representa a omissão de replacement text. Porque só queremos encontrar.

Uma vez obtido o número de ocorrências, você pode pressionar a Ntecla para ver as ocorrências uma a uma.

Para encontrar e contar em determinado intervalo de número de linha 1 a 10:

: 1,10s / olá // gn

  • Observe %que o arquivo inteiro é substituído por ,números de linha separados.

Para localizar e substituir em uma faixa específica do número da linha 1 a 10:

: 1,10s / helo / hello / gn

Om Sao
fonte
0

Eu sugiro fazer:

  1. Pesquise com *para fazer uma "pesquisa limitada" do que está sob o cursor ou fazer uma /patternpesquisa padrão .
  2. Use :%s///gnpara obter o número de ocorrências. Ou você pode usar :%s///npara obter o número de linhas com ocorrências.

** Eu realmente poderia encontrar um plug-in que fornecesse a mensagem "corresponder N de N 1 em N 2 linhas" com cada pesquisa, mas, infelizmente.

Nota: Não se confunda com a formulação complicada da saída. O primeiro comando pode fornecer algo como 4 matches on 3 lineso último pode fornecer 3 matches on 3 lines. Embora tecnicamente preciso, o último é enganoso e deveria dizer 'correspondência de 3 linhas'. Então, como você pode ver, realmente nunca há necessidade de usar a última forma ('n' apenas). Você obtém as mesmas informações, mais claramente e mais usando o formulário 'gn'.

Bruno Bronosky
fonte