ค้นหาสตริงและรับจำนวนในตัวแก้ไข vi


105

ฉันต้องการค้นหาสตริงและค้นหาจำนวนครั้งที่เกิดขึ้นในไฟล์โดยใช้ตัวแก้ไข vi


11
คำตอบที่เลือก ( :g/xxxx/d) นั้นแย่มากอันตรายและด้อยกว่าคำตอบอื่น ๆ ในหน้านี้ โปรดยกเลิกการเลือก
Bruno Bronosky

1
ฉันเห็นด้วยและมันจะบอกคุณว่า 'บรรทัดที่ถูกลบ' ไม่ใช่ 'เหตุการณ์ที่ถูกลบ'
user1709076

คำตอบ:


4
:g/xxxx/d

การดำเนินการนี้จะลบบรรทัดทั้งหมดที่มีรูปแบบและรายงานจำนวนที่ถูกลบ เลิกทำเพื่อดึงกลับมา


6
แน่นอนเขาสามารถละ "d" ได้ดังนั้นเขาจึงไม่จำเป็นต้องดำเนินการ
Rook

15
หมายเหตุสิ่งนี้จะบอกคุณเท่านั้นว่ามีกี่บรรทัด - ไม่ใช่จำนวนครั้งที่เกิดขึ้น ฉันคิดว่าเดิร์กเป็นทางออกที่ดีกว่า

4
วิธีแก้ปัญหาของฉันด้านล่างนับการเกิดหลายครั้งภายในบรรทัดอย่างถูกต้องและไม่มีอะไรต้องเลิกทำ
Mohit Chakraborty

6
อันตรายมาก: o
Ankit Zalani

1
นี่ไม่ควรเป็นคำตอบที่ได้รับการยอมรับ / เป็นที่นิยมมากที่สุด SO Moderator มีอะไรบ้าง? :(
user1412066


121

คุณต้องการnธง ในการนับคำใช้:

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

และคำเฉพาะ:

:%s/the/&/gn        

ดูcount-itemsส่วนเอกสาร

หากคุณเพียงพิมพ์:

%s/pattern/pattern/g

จากนั้นบรรทัดสถานะจะให้จำนวนการแข่งขันใน vi เช่นกัน


ดูเหมือนว่าคำตอบนี้สำหรับผู้ใช้ Vim ไม่ใช่สำหรับ Vi :(
kadeshpa

คุณมีเพียง vi ในระบบของคุณหรือไม่? เวอร์ชั่นไหน
ช้า

มีคนติดแท็ก quesiton ของคุณด้วย vim ในนั้น ... ฉันลบออก
ojblass

38

:% s / string / string / g จะให้คำตอบ


ตอบอะไรดีกว่า +5 ถ้าเป็นไปได้
ojblass

ฉันเดาว่ามันจะใช้ได้ก็ต่อเมื่อไม่มีการใช้ ". *" ในรูปแบบ
AK

10
%s/string//ngไม่จำเป็นต้องทำซ้ำสตริงเพียงแค่ทำ
slm

23

(คล้ายกับที่ Gustavo กล่าว แต่นอกจากนี้ :)

สำหรับการค้นหาก่อนหน้านี้คุณสามารถทำได้ง่ายๆ:

:%s///gn

ไม่จำเป็นต้องใช้รูปแบบเนื่องจากมีอยู่แล้วในการลงทะเบียนการค้นหา ( @/)

"%" - ทำs/ในทั้งไฟล์
"g" - ค้นหาทั่วโลก (พร้อมด้วย Hit หลายรายการในบรรทัดเดียว)
"n" - ป้องกันการแทนที่s/- ไม่มีการลบ! ไม่มีอะไรต้องยกเลิก!
(ดู: :help s_flagสำหรับข้อมูลเพิ่มเติม)

(วิธีนี้ทำงานได้อย่างสมบูรณ์แบบกับ " ค้นหาข้อความที่เลือกด้วยภาพ " ตามที่อธิบายไว้ในvim-wikia tip171 )



1

คำตอบสั้น ๆ :

:% s / string-to-be-search // gn

เพื่อการเรียนรู้ :

มี 3 โหมดในตัวแก้ไข VI ดังต่อไปนี้ ป้อนคำอธิบายภาพที่นี่

  • :คุณกำลังเข้าจากCommandไปCommand-lineโหมด ตอนนี้สิ่งที่คุณเขียนหลังจากนั้น:อยู่บน CLI (Command Line Interface)
  • %sระบุทุกบรรทัด การระบุช่วงเป็น%วิธีการแทนที่ในไฟล์ทั้งหมด ไวยากรณ์สำหรับการแทนที่เหตุการณ์ทั้งหมดคือ:%s/old-text/new-text/g
  • gระบุเหตุการณ์ทั้งหมดในบรรทัด ด้วยgแฟล็กคุณสามารถทำให้ทั้งเส้นถูกแทนที่ได้ หากgไม่ได้ใช้แฟล็กนี้จะมีการแทนที่เฉพาะครั้งแรกในบรรทัดเท่านั้น
  • n ระบุจำนวนเอาต์พุตที่เกิดขึ้น
  • //replacement textเฉือนคู่แสดงให้เห็นถึงการละเลย เพราะเราแค่ต้องการค้นหา

เมื่อได้จำนวนเหตุการณ์แล้วคุณสามารถกดNคีย์เพื่อดูเหตุการณ์ทีละรายการ

สำหรับการค้นหาและการนับในช่วงเฉพาะของบรรทัดหมายเลข 1 ถึง 10:

: 1,10s / สวัสดี // gn

  • โปรดทราบว่า%สำหรับไฟล์ทั้งหมดจะถูกเติมด้วย,หมายเลขบรรทัดที่คั่นไว้

สำหรับการค้นหาและแทนที่ในช่วงเฉพาะของบรรทัดหมายเลข 1 ถึง 10:

: 1,10s / helo / hello / gn


0

ฉันขอแนะนำให้ทำ:

  1. ค้นหาด้วย*เพื่อทำการ "ค้นหาขอบเขต" สำหรับสิ่งที่อยู่ใต้เคอร์เซอร์หรือ/patternทำการค้นหามาตรฐาน
  2. ใช้:%s///gnเพื่อรับจำนวนครั้งที่เกิดขึ้น หรือคุณสามารถใช้:%s///nเพื่อรับจำนวนบรรทัดที่เกิดขึ้น

**จริงๆแล้วฉันสามารถหาปลั๊กอินที่จะส่งข้อความ "จับคู่ N ของ N 1บน N 2บรรทัด" ในทุกการค้นหา แต่อนิจจา

หมายเหตุ: อย่าสับสนกับคำที่ยุ่งยากของผลลัพธ์ อดีตคำสั่งอาจทำให้คุณบางอย่างเช่นที่หลังอาจทำให้คุณ4 matches on 3 lines 3 matches on 3 linesแม้ว่าความถูกต้องในทางเทคนิคคำหลังนั้นทำให้เข้าใจผิดและควรพูดว่า 'จับคู่ 3 บรรทัด' อย่างที่คุณเห็นไม่มีความจำเป็นใด ๆ ที่จะต้องใช้แบบฟอร์มหลัง ('n' เท่านั้น) คุณจะได้รับข้อมูลเดียวกันชัดเจนยิ่งขึ้นและมากขึ้นโดยใช้แบบฟอร์ม "gn"

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