คุณสามารถทำได้ด้วยEx
คำสั่งที่ใช้sed
เป็นตัวกรองภายนอก:
:%!sed -n 'h;n;G;h;n;G;h;n;G;p'
รุ่นนี้จะละเว้น (ลบ) บรรทัดพิเศษใด ๆ ที่เกินกว่า 4 เท่าเพื่อให้อยู่ในชุดสุดท้ายของน้อยกว่า 4 บรรทัด (กลับด้าน) ให้ใช้:
:%!sed -n '$p;h;n;G;$p;h;n;G;$p;h;n;G;p'
%
ที่นี่หมายถึง "เส้นในบัฟเฟอร์ทุกคน."
!
คำสั่งหมายถึง "เรียกใช้คำสั่งต่อไปนี้ที่มีเส้นที่ระบุเป็น input และเปลี่ยนสายที่ระบุกับการส่งออกของคำสั่ง." (มันเรียกว่าตัวกรองซึ่งมีประโยชน์มากสำหรับสิ่งต่าง ๆ เช่นการเรียงลำดับเช่น:%!sort
จะเรียงลำดับบรรทัดทั้งหมดในไฟล์ของคุณ:2,8!sort
จะเรียงลำดับบรรทัด 2-8 เป็นต้น)
sed
เป็นเครื่องมือแก้ไขสตรีมและพบได้ในทุกระบบของ Unix แนวคิดหลักของการsed
ใช้ที่นี่คือ "pattern space" (ซึ่งโดยปกติแล้วจะประกอบด้วยแต่ละบรรทัดของอินพุตในทางกลับกัน) และ "hold space" (ซึ่งเป็นที่ที่คุณสามารถติดข้อความพิเศษในขณะที่ใช้sed
เพื่อบันทึกขณะประมวลผลอื่น ๆ บรรทัดอินพุต)
-n
เป็นตัวเลือกให้กับsed
คำสั่งเพื่อระงับการกระทำเริ่มต้นของการพิมพ์พื้นที่รูปแบบ (เพราะในกรณีนี้เราต้องการพิมพ์เฉพาะเมื่อเราพูดอย่างชัดเจนเท่านั้น)
$p
ในsed
คำสั่งหมายถึง "ถ้าคุณอยู่ในบรรทัดสุดท้ายของsed
อินพุตให้พิมพ์ (พื้นที่รูปแบบ)"
h
หมายถึง "ติดเนื้อหาปัจจุบันของ 'pattern space' ใน 'hold space' โดยเขียนทับอะไรก็ตามที่อยู่ที่นั่น"
n
หมายถึง "แทนที่เนื้อหาของ 'pattern space' ด้วยบรรทัดถัดไปจากอินพุต"
G
หมายถึง "ผนวกเข้ากับ 'pattern space': ขึ้นบรรทัดใหม่ตามด้วยเนื้อหาของ 'hold space'"
เมื่อรวมเข้าด้วยกันsed
คำสั่งจะเก็บเอาต์พุตสี่บรรทัดย้อนกลับขณะที่มันจัดเก็บแล้วพิมพ์ออกมา $p
คำสั่งเพิ่มในรุ่นที่สองให้มั่นใจว่าถ้าบรรทัดสุดท้ายของไฟล์จะถึงอื่น ๆ กว่าหลาย 4 เส้นเส้นยังคงพิมพ์
สำหรับทางเลือกวิธีการอินเทอร์แอคทีฟยังคงไม่ใช้คุณลักษณะเฉพาะของ Vim และโดยไม่ต้องใช้ตัวกรองภายนอก:
:4
เพื่อไปที่บรรทัดที่สี่
:.m -4 | +3m . | +2m . | +5
เพื่อย้อนกลับสี่บรรทัดก่อนหน้า (1-4) และปล่อยเคอร์เซอร์ของคุณไว้ที่บรรทัดที่ 8
.m -4
ย้ายบรรทัดปัจจุบันไปหลังบรรทัดสี่บรรทัดย้อนกลับ (ปล่อยเคอร์เซอร์บนบรรทัดที่ย้าย)
+3m .
ย้ายสายที่ 3 สายหลังจากบรรทัดปัจจุบันเพื่อเพียงหลังจากบรรทัดปัจจุบันออกจากเคอร์เซอร์บนเส้นย้าย +2m .
แน่นอนทำงานเหมือนกัน
+5
วางเคอร์เซอร์ลงห้าบรรทัดจากตำแหน่งที่มันอยู่
ทำซ้ำตามที่ต้องการ
ในกลุ่มคุณสามารถทำซ้ำคำสั่งทั้งหมดนี้ด้วยแล้วทำซ้ำอีกครั้งกับ@:
@@
ใน POSIX vi
หรือex
คุณต้องการแทรก :.m -4 | +3m . | +2m . | +5
เป็นบรรทัดข้อความให้ลบลงในบัฟเฟอร์ที่มีชื่อ (รีจิสเตอร์) จากนั้นดำเนินการบัฟเฟอร์ที่มีชื่อ (รีจิสเตอร์)
ดังนั้นในex
โหมดการย้อนกลับบรรทัดแบบโต้ตอบโดยใช้คุณลักษณะที่ระบุ POSIX เท่านั้นและเริ่มต้นด้วยข้อความ 17 บรรทัด:
Entering Ex mode. Type "visual" to go to Normal mode.
:0a # Append following text after "line 0" (i.e. insert at start of file).
.m -4 | +3m . | +2m . | +5
. # End text insertion
:d k # Delete that line to register k
line1 # This is a printout of the current line
:4 # Move to line 4
line4
:@k # Execute register k to reverse lines 1-4
line8
:@@ # Execute register k again
line12
:@@ # Execute register k again
line16
:@@ # Execute register k again
line17
:%p # Print the whole buffer (just to see what was done)
line4
line3
line2
line1
line8
line7
line6
line5
line12
line11
line10
line9
line16
line15
line14
line13
line17
:wq # Save and quit
อ่านเพิ่มเติม: