ฉันคิดว่าคำสั่งต่อไปนี้จะทำงาน:
:%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แต่ไฮไลต์และการตั้งค่าสถานะการยืนยันนั้นดี