ฉันต้องการค้นหาสตริงและค้นหาจำนวนครั้งที่เกิดขึ้นในไฟล์โดยใช้ตัวแก้ไข vi
ฉันต้องการค้นหาสตริงและค้นหาจำนวนครั้งที่เกิดขึ้นในไฟล์โดยใช้ตัวแก้ไข vi
คำตอบ:
:g/xxxx/d
การดำเนินการนี้จะลบบรรทัดทั้งหมดที่มีรูปแบบและรายงานจำนวนที่ถูกลบ เลิกทำเพื่อดึงกลับมา
วิธีคือ
:% s / pattern // gn
คุณต้องการnธง ในการนับคำใช้:
:%s/\i\+/&/gn
และคำเฉพาะ:
:%s/the/&/gn
ดูcount-itemsส่วนเอกสาร
หากคุณเพียงพิมพ์:
%s/pattern/pattern/g
จากนั้นบรรทัดสถานะจะให้จำนวนการแข่งขันใน vi เช่นกัน
(คล้ายกับที่ Gustavo กล่าว แต่นอกจากนี้ :)
สำหรับการค้นหาก่อนหน้านี้คุณสามารถทำได้ง่ายๆ:
:%s///gn
ไม่จำเป็นต้องใช้รูปแบบเนื่องจากมีอยู่แล้วในการลงทะเบียนการค้นหา ( @/)
"%" - ทำs/ในทั้งไฟล์
"g" - ค้นหาทั่วโลก (พร้อมด้วย Hit หลายรายการในบรรทัดเดียว)
"n" - ป้องกันการแทนที่s/- ไม่มีการลบ! ไม่มีอะไรต้องยกเลิก!
(ดู: :help s_flagสำหรับข้อมูลเพิ่มเติม)
(วิธีนี้ทำงานได้อย่างสมบูรณ์แบบกับ " ค้นหาข้อความที่เลือกด้วยภาพ " ตามที่อธิบายไว้ในvim-wikia tip171 )
ใช้
:% s / รูปแบบ / \ 0 / g
เมื่อสตริงรูปแบบยาวเกินไปและคุณไม่ต้องการพิมพ์ใหม่ทั้งหมด
คำตอบสั้น ๆ :
:% s / string-to-be-search // gn
เพื่อการเรียนรู้ :
มี 3 โหมดในตัวแก้ไข VI ดังต่อไปนี้

:คุณกำลังเข้าจากCommandไปCommand-lineโหมด ตอนนี้สิ่งที่คุณเขียนหลังจากนั้น:อยู่บน CLI (Command Line Interface)%sระบุทุกบรรทัด การระบุช่วงเป็น%วิธีการแทนที่ในไฟล์ทั้งหมด ไวยากรณ์สำหรับการแทนที่เหตุการณ์ทั้งหมดคือ:%s/old-text/new-text/ggระบุเหตุการณ์ทั้งหมดในบรรทัด ด้วยgแฟล็กคุณสามารถทำให้ทั้งเส้นถูกแทนที่ได้ หากgไม่ได้ใช้แฟล็กนี้จะมีการแทนที่เฉพาะครั้งแรกในบรรทัดเท่านั้นn ระบุจำนวนเอาต์พุตที่เกิดขึ้น //replacement textเฉือนคู่แสดงให้เห็นถึงการละเลย เพราะเราแค่ต้องการค้นหาเมื่อได้จำนวนเหตุการณ์แล้วคุณสามารถกดNคีย์เพื่อดูเหตุการณ์ทีละรายการ
สำหรับการค้นหาและการนับในช่วงเฉพาะของบรรทัดหมายเลข 1 ถึง 10:
: 1,10s / สวัสดี // gn
%สำหรับไฟล์ทั้งหมดจะถูกเติมด้วย,หมายเลขบรรทัดที่คั่นไว้ สำหรับการค้นหาและแทนที่ในช่วงเฉพาะของบรรทัดหมายเลข 1 ถึง 10:
: 1,10s / helo / hello / gn
ฉันขอแนะนำให้ทำ:
*เพื่อทำการ "ค้นหาขอบเขต" สำหรับสิ่งที่อยู่ใต้เคอร์เซอร์หรือ/patternทำการค้นหามาตรฐาน:%s///gnเพื่อรับจำนวนครั้งที่เกิดขึ้น หรือคุณสามารถใช้:%s///nเพื่อรับจำนวนบรรทัดที่เกิดขึ้น**จริงๆแล้วฉันสามารถหาปลั๊กอินที่จะส่งข้อความ "จับคู่ N ของ N 1บน N 2บรรทัด" ในทุกการค้นหา แต่อนิจจา
หมายเหตุ: อย่าสับสนกับคำที่ยุ่งยากของผลลัพธ์ อดีตคำสั่งอาจทำให้คุณบางอย่างเช่นที่หลังอาจทำให้คุณ4 matches on 3 lines 3 matches on 3 linesแม้ว่าความถูกต้องในทางเทคนิคคำหลังนั้นทำให้เข้าใจผิดและควรพูดว่า 'จับคู่ 3 บรรทัด' อย่างที่คุณเห็นไม่มีความจำเป็นใด ๆ ที่จะต้องใช้แบบฟอร์มหลัง ('n' เท่านั้น) คุณจะได้รับข้อมูลเดียวกันชัดเจนยิ่งขึ้นและมากขึ้นโดยใช้แบบฟอร์ม "gn"
:g/xxxx/d) นั้นแย่มากอันตรายและด้อยกว่าคำตอบอื่น ๆ ในหน้านี้ โปรดยกเลิกการเลือก