파일에서 단어의 발생 횟수를 세는 방법이 있습니까?


68

파일에 단어 나 패턴이 몇 번 나타나는지 계산할 수 있습니까? 함수가 몇 번이나 호출되었는지 등을 알아내는 데 유용한 경우가 있습니다.


답변:


93

Quincy의 대답은 훌륭하지만 버퍼를 편집 할 필요가없는 정확한 방법이 있습니다.

:%s/pattern//ng

그러면 같은 메시지가 인쇄되고 3 matches on 2 lines버퍼가 변경되지 않습니다.

n플래그하게 :substitute명령 실제 교체를 수행하는 대신 일치의 숫자를 인쇄; 이 g플래그를 사용하면 한 줄에 여러 개의 일치 항목을보고 할 수 있습니다.


사용 사례에 유용한 또 다른 것은 패턴과 일치하는 모든 줄을 인쇄하는 것입니다.

:global/pattern/print

단축 할 수 있습니다 :

:g/pattern

이것은 :global명령을 가장 간단하게 사용하는 것 중 하나입니다 (정말 놀라 울 정도로 강력 함). 단순히 일치하는 모든 행을 인쇄 pattern한 다음 (둘 이상의 행이있는 경우) Enter다른 명령을 누르 거나 입력하여 사라지게합니다.

약간의 사소한 표현 :이 명령은 grep일반적으로로 설명되는 것처럼 name의 원점입니다. g/re/p여기서 re"정규 표현식"을 나타냅니다.


2
+1 이것은 매우 좋은 답변이며, 현장에서 동시에 합리적으로 상세합니다. 대부분의 질문에 그러한 답변이 있기를 바랍니다. :)
yo '

훌륭한 답변과 놀라운 퀴즈!
BiBi

나는 이것을 일년에 2-3 번해야하며 구문을 기억하지 않으므로 매번 검색 시스템에 적용됩니다. 이 명확한 대답에 대해 감사의 말을 전하고 싶습니다. 왜냐하면 그것이 두 번 이상 있었으며 몇 년 동안 그 끔찍한 위키 페이지를 저를 구해 주었기 때문입니다! (페이지의 내용이 아닌 wikia)
Will

1
작은 비트 : 명령 g/re/p은 실제로 ed아닙니다 vi. Grep은 2 년 전에 vi보다 먼저 사용됩니다.
Will

나는이 nnoremap <leader>n :%s///gn<CR>매핑. <leader>n이전에 검색 한 패턴의 발생 횟수를 세려면 누릅니다 . 나는 이것을 놀랍게도 자주 사용합니다.
Rolf

15

:%s/pattern//nn끝에 있는 플래그는 :s명령에 지시 하여 일치 수를보고하지만 실제로 대체하지는 않습니다. :h :s_flags자세한 내용을 읽으십시오 .


4
그렇지 gn않습니까?
yo '

1
@yo '예, g는 단지 다른 플래그 g이지만 한 줄에 둘 이상의 일치 항목이 있다고 생각되면 사용하고 싶을 때가 종종 있습니다. 그러나 문제의 목적을 위해 깃발 n이 더 중요합니다.
Dhruva Sagar

5

먼저 /정규식을 검색 하는 데 사용 한 다음

:%s///gn

이것은 Dhurva의 대답과 동일하지만 a.) 사용하기 쉽습니다 (정규식이 먼저 일치하는 결과를 미리 볼 수 있기 때문에) 및 b.) 모든 발생 g을 계산하기 위해 전 세계적으로 플래그 와 일치 합니다.



2

:%s/pattern//g

상태 표시 줄에 대체 횟수가 표시됩니다. 그것은 몇 번이나 pattern나타납니다. 그런 다음을 눌러 u대체를 취소하십시오.


1

여기에 대한 답변을 기반으로 .vimrc에 추가 한 매핑 :

" count nr of occurrences of word under cursor
nnoremap <leader>c :%s/<c-r><c-w>//gn<cr>

" count nr of occurrences of visual selection
vnoremap <leader>c :<c-u>%s/<c-r>*//gn<cr>

새로운 비머에 도움이되는 약간의 설명 :

  • <c-r><c-w> 명령 행에서 커서 아래에 단어를 삽입하여 여러 경우에 편리합니다.

  • <c-u>자동 삽입을 제거 할 필요 '<,'> 누르면 :영상 모드 및 명령 줄 것. *레지스터는 (최종) 영상 선택을 포함 <c-r>* 의 콘텐츠 삽입 *(또는 삽입 모드에서 사용될 수있다) 명령 라인 레지스터.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.