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.


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.


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


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.


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.


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 )


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.


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


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'.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.