อย่างไร: g /^$/,/./- j (ลดบรรทัดว่างหลาย ๆ บรรทัดเป็นหนึ่งช่องว่าง) ทำงานเป็นกลุ่ม?


21

ในบทความVim Regular Expressions , Oleg Raisky ให้คำสั่งต่อไปนี้เพื่อลดบรรทัดว่างหลายบรรทัดให้เป็นหนึ่งช่องว่าง:

:g/^$/,/./-j

มีคนช่วยอธิบายวิธีการทำงานนี้ได้ไหม

ฉันรู้ว่า:gคำสั่งและการแสดงออกปกติ แต่ฉันไม่เข้าใจว่าส่วน/,/./-jนั้นทำอะไร

คำตอบ:


24

มันฉลาดจริงๆ มาทำลายมันกันเถอะ 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เอกสารระบุอัลกอริธึมสองรอบหนึ่งอันเพื่อทำเครื่องหมายบรรทัดหนึ่งเพื่อดำเนินการ


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