ฉันคิดว่าคำสั่งต่อไปนี้จะทำงาน:
:%s/^\(.*\)\(\n\1\)\+$/\1/
คำอธิบาย:
เราใช้คำสั่งการแทนที่ในไฟล์ทั้งหมดเพื่อเปลี่ยนpattern
เป็นstring
:
:%s/pattern/string/
นี่pattern
เป็น^\(.*\)\(\n\1\)\+$
และเป็นstring
\1
pattern
สามารถถูกทำลายลงเช่นนี้
^\(subpattern1\)\(subpattern2\)\+$
^
และ$
จับคู่จุดเริ่มต้นของบรรทัดและจุดสิ้นสุดตามลำดับ
\(
และ\)
จะใช้ในการปิดล้อมเพื่อให้เราสามารถดูได้ในภายหลังจากจำนวนพิเศษsubpattern1
พวกเขายังใช้เพื่อใส่เพื่อให้เราสามารถทำซ้ำได้ 1 ครั้งหรือมากกว่าที่มีปริมาณ\1
subpattern2
\+
subpattern1
เป็น.*
.
ตัวเปรียบเทียบที่จับคู่อักขระใด ๆ ยกเว้นบรรทัดใหม่และ*
เป็นตัวระบุปริมาณที่ตรงกับอักขระตัวสุดท้าย 0, 1 หรือมากกว่านั้น
ดังนั้น.*
ตรงกับข้อความใด ๆ ที่ไม่มีบรรทัดใหม่
subpattern2
คือ\n\1
\n
ตรงบรรทัดใหม่และ\1
ตรงกับข้อความเดียวกับที่ถูกจับคู่ภายในครั้งแรก\(
, ที่นี่คือ\)
subpattern1
ดังนั้นpattern
สามารถอ่านได้เช่นนี้:
จุดเริ่มต้นของบรรทัด ( ^
) ตามด้วยข้อความใด ๆ ที่ไม่มีบรรทัดใหม่ ( .*
) ตามด้วยบรรทัดใหม่ ( \n
) จากนั้นข้อความเดียวกัน ( \1
) สองข้อความหลังถูกทำซ้ำอย่างน้อยหนึ่งครั้ง ( \+
) และ ในที่สุดก็สิ้นสุดของบรรทัด (ให้$
)
เมื่อใดก็ตามที่pattern
จับคู่ (บล็อกของบรรทัดที่เหมือนกัน) คำสั่งการแทนที่จะแทนที่ด้วยstring
ที่นี่คือ\1
(บรรทัดแรกของบล็อก)
หากคุณต้องการดูว่าบล็อกบรรทัดใดจะได้รับผลกระทบโดยไม่ต้องเปลี่ยนแปลงอะไรในไฟล์ของคุณคุณสามารถเปิดใช้งานhlsearch
ตัวเลือกและเพิ่มการn
ตั้งค่าสถานะการแทนที่ที่ส่วนท้ายของคำสั่ง:
:%s/^\(.*\)\(\n\1\)\+$/\1/n
สำหรับการควบคุมแบบละเอียดมากขึ้นคุณสามารถขอการยืนยันก่อนที่จะเปลี่ยนแต่ละบรรทัดของบล็อกโดยการเพิ่มการc
ตั้งค่าสถานะการแทนที่แทน:
:%s/^\(.*\)\(\n\1\)\+$/\1/c
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคำสั่งเปลี่ยนตัวอ่าน:help :s
,
ธงทดแทน:help s_flags
,
สำหรับ metacharacters ต่างๆและปริมาณอ่าน:help pattern-atoms
,
และการแสดงผลปกติในกลุ่มอ่านนี้
แก้ไข: Wildcardคงมีปัญหาในคำสั่งโดยการเพิ่มในตอนท้ายของ$
pattern
นอกจากนี้BloodGainยังมีคำสั่งเดียวกันที่สั้นกว่าและสามารถอ่านได้มากขึ้น
$
ในนั้น มิฉะนั้นจะทำสิ่งที่ไม่คาดคิดกับบรรทัดที่เริ่มต้นด้วยข้อความที่เหมือนกันในบรรทัดก่อนหน้า แต่มีอักขระต่อท้ายอื่น ๆ โปรดทราบว่าคำสั่งพื้นฐานที่คุณให้นั้นมีฟังก์ชั่นเทียบเท่ากับคำตอบของฉัน:%!uniq
แต่ไฮไลต์และการตั้งค่าสถานะการยืนยันนั้นดี