วิธีการจับผลลัพธ์ของคำสั่ง regex-powered ในโหมดปกติ Vim?


2

ฉันต้องการค้นหาจำนวนครั้งที่ 'x' ปรากฏอยู่ในไฟล์ของฉันดังนั้นฉันจึงส่ง %s/x//gn และรับคำตอบที่ถูกต้อง

ฉันจะจับผลลัพธ์นับเป็นตัวแปรโดยใช้ vimscript บนบรรทัดคำสั่งได้อย่างไร

วิธีการแก้ปัญหาต่อไปนี้ถูกบอกใบ้โดยคำตอบด้านล่าง:

:let cnt=0
:g/x/let cnt=cnt+1
:echo cnt

อย่างไรก็ตาม cnt ถูกสร้างขึ้นเพื่อเก็บจำนวนบรรทัดทั้งหมดในบัฟเฟอร์ที่มี xไม่กี่ x มีอยู่ในไฟล์ทั้งหมด

ดังนั้นคำถามเดิมยังคงอยู่

คำตอบ:


1

ลิงค์ที่คุณระบุถึงคำสั่ง : กรัม ซึ่งสามารถใช้ในการนับ เส้น ที่ regex ตรงกัน แต่ไม่ใช่จำนวนครั้งที่มันตรงกับในบรรทัดซึ่งเป็นสิ่งที่ฉันต้องการ
drapkin11

@ drapkin11: จุดดี ฉันรู้ว่ามันสามารถทำได้ด้วยสคริปต์ Vim แต่ฉันไม่ได้ตระหนักถึงวิธีที่สง่างามกว่าที่จะทำ
Heptite

0

คุณสามารถลองสิ่งนี้

:let cnt=0
:g/^.*may/let cnt=cnt+1
:echo cnt

ดังนั้นคุณจะเห็นจำนวนบรรทัดที่มีคำว่า 'อาจ' ในนั้นอย่างน้อยหนึ่งครั้ง ดังนั้นข้อความต่อไปนี้จะถูกนับเป็น 1:

Your mileage may vary. You may have already won.

ง่าย.


ขอบคุณ แต่นี่คล้ายกับคำแนะนำของ @ Heptite ซึ่งไม่สามารถแก้ไขคำถามเดิม โปรดทราบว่าฉันต้องมีการนับ ทั้งหมด อินสแตนซ์ของการจับคู่ในแต่ละบรรทัดไม่ใช่เพียงอันเดียว
drapkin11

0

ต่อไปนี้จะหลอกลวง:

:echo eval(join(map(range(1, line('$')), 'len(substitute(getline(v:val),"[^x]","","g"))')," + "))

สิ่งนี้จะแทนที่ทั้งหมดที่ไม่ใช่ x อักขระที่ไม่มีอะไรนับจำนวนอักขระที่เหลืออยู่ (ควรเป็น x s) และเพิ่มผลลัพธ์นี้สำหรับแต่ละบรรทัดในไฟล์

ฉันมีความคิดสำหรับเทคนิคนี้โดยใช้ map ฟังก์ชั่นจาก เดนนิสวิลเลียมสัน ในโพสต์อื่นในการเขียนสคริปต์เป็นกลุ่ม

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