ในบทความVim Regular Expressions , Oleg Raisky ให้คำสั่งต่อไปนี้เพื่อลดบรรทัดว่างหลายบรรทัดให้เป็นหนึ่งช่องว่าง:
:g/^$/,/./-j
มีคนช่วยอธิบายวิธีการทำงานนี้ได้ไหม
ฉันรู้ว่า:g
คำสั่งและการแสดงออกปกติ แต่ฉันไม่เข้าใจว่าส่วน/,/./-j
นั้นทำอะไร
ในบทความVim Regular Expressions , Oleg Raisky ให้คำสั่งต่อไปนี้เพื่อลดบรรทัดว่างหลายบรรทัดให้เป็นหนึ่งช่องว่าง:
:g/^$/,/./-j
มีคนช่วยอธิบายวิธีการทำงานนี้ได้ไหม
ฉันรู้ว่า:g
คำสั่งและการแสดงออกปกติ แต่ฉันไม่เข้าใจว่าส่วน/,/./-j
นั้นทำอะไร
คำตอบ:
มันฉลาดจริงๆ มาทำลายมันกันเถอะ ex
คำสั่ง
g/^$/xyzzy
จะค้นหาบรรทัดว่างทั้งหมดและดำเนินการxyzzy
คำสั่ง ( ex
คำสั่งโดยพลการ) ในแต่ละบรรทัด โปรดทราบว่าxyzzy
ไม่ใช่คำสั่งจริง ex
มีเพียงตัวยึดตำแหน่งเท่านั้นตามย่อหน้าถัดไป
บิตยุ่งยากนี่คือxyzzy
"คำสั่ง" ในกรณีของคุณยังเป็นคำสั่งค้นหาอื่น :
,/./-j
ช่วงที่,/./-
ระบุ นี่คือรูปแบบ<start>,<end>
และเนื่องจากไม่มีอะไรมาก่อนเครื่องหมายจุลภาคจะถือว่าบรรทัดปัจจุบัน (บรรทัดที่คุณพบบรรทัดว่าง) คือจุดเริ่มต้น
หลังจากเครื่องหมายจุลภาค/./-
ซึ่งหมายถึงการค้นหาอักขระถัดไป ( .
หมายถึงอักขระใด ๆ ) จากนั้นสำรองข้อมูลหนึ่งบรรทัด ( /./-
ย่อ/./-1
มาจากคำว่าตั้งแต่หนึ่งตัวจะถูกส่อให้เห็นหากไม่มีการระบุค่า) คุณจะพบรูปแบบนั้น.
ในบรรทัดแรกที่ไม่ว่างเปล่าตามหลังรูปแบบที่คุณดำเนินการ
กล่าวอีกนัยหนึ่งจุดสิ้นสุดของช่วงคือบรรทัดว่างสุดท้ายหลังหรือที่บรรทัดที่คุณกำลังเปิดอยู่
จากนั้นคุณดำเนินการเข้าร่วมในช่วงนั้น
หากการเริ่มต้นและจุดสิ้นสุดของช่วงเท่ากัน (บรรทัดว่างเพียงบรรทัดเดียวอยู่ในส่วน) การเข้าร่วมไม่ได้ทำอะไรเลย หากพวกเขาไม่เท่ากันเข้าร่วมจะเข้าร่วมพวกเขาทั้งหมด
นั่นเป็นวิธีที่มันรวมหลายบรรทัดว่างไว้ในที่เดียว
ให้ดูตัวอย่าง (หมายเลขบรรทัดนี้ใช้สำหรับอธิบายเท่านั้นมันไม่ได้อยู่ในไฟล์จริง):
1 Line 1
2
3 Line 3
4 Line 4
5
6
7
8
9 Line 9
g/^$/
คำสั่งจะพบบรรทัดว่างและดำเนินการในวันที่พวกเขา (เหล่านี้เป็นสาย 2, 5, 6, 7 และ 8)
สำหรับบรรทัดที่ 2 ,/./-j
จะตั้งค่าช่วงจาก 2 ถึง 2 ( .
จะพบบรรทัดถัดไปที่บรรทัดที่ 3 จากนั้นลบ 1 เพื่อรับ 2) การเข้าร่วมในช่วง 2,2 ไม่ได้ทำอะไรเลย
สำหรับบรรทัดที่ 5 ,/./-j
จะตั้งค่าช่วงจาก 5 ถึง 8 ( .
พบในบรรทัดที่ 9 จากนั้นลบ 1) การเข้าร่วมในช่วง 5,8 จะเข้าร่วมบรรทัดทั้งหมดเข้าด้วยกัน
การดำเนินการจะไม่ดำเนินการกับบรรทัดที่หายไปซึ่งเป็นส่วนหนึ่งของการดำเนินการก่อนหน้านี้ นั่นเป็นเพราะมันไม่สมเหตุสมผลกับกระบวนการของบรรทัดที่ถูกลบไปก่อนหน้านี้ในรอบ
กล่าวอีกนัยหนึ่งเนื่องจากบรรทัดที่ 6 ถึง 8 ถูกลบ (รวมกับบรรทัดที่ 5) คำสั่งโกลบอลจะไม่ทำงานหลังจากนั้น
นั่นขึ้นอยู่กับข้อเท็จจริงที่ว่าvim
เอกสารระบุอัลกอริธึมสองรอบหนึ่งอันเพื่อทำเครื่องหมายบรรทัดหนึ่งเพื่อดำเนินการ