มีวิธีการนับจำนวนคำในไฟล์หรือไม่?


68

เป็นไปได้ไหมที่จะนับจำนวนคำหรือรูปแบบที่ปรากฏในไฟล์? บางครั้งมีประโยชน์ในการค้นหาว่ามีการเรียกใช้ฟังก์ชันกี่ครั้ง ฯลฯ


คำตอบ:


93

คำตอบของ Quincy นั้นใช้ได้ แต่มีวิธีที่แน่นอนในการทำเช่นนี้ซึ่งไม่ต้องการแก้ไขบัฟเฟอร์:

:%s/pattern//ng

สิ่งนี้จะพิมพ์ข้อความเช่น3 matches on 2 linesนี้และจะไม่มีการเปลี่ยนแปลงใด ๆ กับบัฟเฟอร์ของคุณ

nธงทำให้:substituteคำสั่งพิมพ์จำนวนของการแข่งขันแทนการดำเนินการเปลี่ยนตัวจริง การgตั้งค่าสถานะช่วยให้การรายงานการแข่งขันหลายรายการต่อบรรทัด


อีกสิ่งที่อาจเป็นประโยชน์ต่อกรณีการใช้งานของคุณคือการพิมพ์ทุกบรรทัดที่ตรงกับรูปแบบ:

:global/pattern/print

ซึ่งสามารถย่อให้เป็น:

:g/pattern

นี่เป็นหนึ่งในการใช้งานที่ง่ายที่สุดของ:globalคำสั่ง (ซึ่งมีประสิทธิภาพเหลือเชื่อ) มันจะพิมพ์บรรทัดที่ตรงกันpatternทั้งหมดแล้ว (ถ้ามีมากกว่าหนึ่งบรรทัด) คุณกดEnterหรือพิมพ์คำสั่งอื่นเพื่อให้หายไป

เรื่องไม่สำคัญ: คำสั่งนี้เป็นที่มาของชื่อgrepตามปกติจะอธิบายเป็นg/re/pที่reหมายถึง "การแสดงออกปกติ"


2
+1 นี่เป็นคำตอบที่ดีตรงประเด็นและให้รายละเอียดอย่างสมเหตุสมผลในเวลาเดียวกัน หวังว่าคำถามส่วนใหญ่จะได้คำตอบดังกล่าว! :)
yo '

คำตอบที่ดีและเรื่องไม่สำคัญที่น่าทึ่ง!
BiBi

ฉันต้องทำอย่างนี้ปีละ 2-3 ครั้งและไม่จำไวยากรณ์ดังนั้นมันจึงเป็นเครื่องค้นหาทุกครั้ง แค่อยากจะบอกว่าขอบคุณสำหรับคำตอบที่ชัดเจนนี้เพราะมันอยู่ที่นั่นมากกว่าหนึ่งครั้งและมีสองสามปีตอนนี้ช่วยฉันหน้า wikia อันน่ากลัว! (wikia ไม่ใช่เนื้อหาของหน้า)
จะ

1
บิตไมเนอร์: คำสั่งg/re/pเป็นจริงจากการไม่ได้ed viGrep ถือกำเนิด vi โดยสองสามปี
จะ

ฉันมีnnoremap <leader>n :%s///gn<CR>แผนที่ ดังนั้นฉันกด<leader>nเพื่อนับการเกิดขึ้นของรูปแบบการค้นหาก่อนหน้านี้ ฉันใช้สิ่งนี้บ่อยครั้งอย่างแปลกใจ
Rolf

15

:%s/pattern//nการnตั้งค่าสถานะในที่สุดบอกให้:sคำสั่งเพื่อรายงานจำนวนการแข่งขันและไม่ได้แทนที่จริง อ่าน:h :s_flagsรายละเอียดเพิ่มเติม


4
ไม่ใช่gnเหรอ
yo '

1
@yo 'ใช่แม้ว่า g เป็นเพียงแค่ธงอื่นคุณก็ต้องการใช้gเช่นกันหากคุณรู้สึกว่าอาจมีการแข่งขันมากกว่าหนึ่งรายการต่อบรรทัดซึ่งมักเป็นจริง สำหรับวัตถุประสงค์ของคำถามอย่างไรก็ตามธงnมีความสำคัญมากกว่า
Dhruva Sagar

5

ก่อนอื่น/ให้ใช้การค้นหา regex จากนั้น

:%s///gn

นี่เป็นคำตอบเดียวกับ Dhurva ยกเว้นว่าเป็น a.) ใช้งานได้ง่ายกว่า (เนื่องจากคุณสามารถดูตัวอย่างผลลัพธ์ของ regex ที่ตรงกันก่อน) และ b.) จับคู่กับgค่าสถานะทั่วโลกเพื่อนับเหตุการณ์ทั้งหมด


3

ต้องขอบคุณ PR https://github.com/vim/vim/pull/4317คำสั่งการค้นหาแต่ละคำสั่งจะแสดงสถิติการค้นหา (เช่นตำแหน่งการแข่งขันปัจจุบันและจำนวนการแข่งขัน) ในเวอร์ชั่น 8.1.1270 ตรวจสอบให้แน่ใจที่จะลบจากตัวแปรSshortmess


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>

คำอธิบายเล็กน้อยหวังว่าจะเป็นประโยชน์สำหรับ vimmers รุ่นใหม่:

  • <c-r><c-w> แทรกคำใต้เคอร์เซอร์ในบรรทัดคำสั่งซึ่งมีประโยชน์หลายครั้ง

  • <c-u>เป็นสิ่งจำเป็นที่จะเอาแทรกโดยอัตโนมัติ'<,'> เมื่อมีการกด:ในโหมดภาพและจะบรรทัดคำสั่ง *ทะเบียนมี (ที่ผ่านมา) เลือกภาพ<c-r>* แทรกเนื้อหาของ*การลงทะเบียนในบรรทัดคำสั่ง (นอกจากนี้ยังสามารถใช้ในโหมดแทรก)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.