ตัวแก้ไข Vi: วิธีที่เร็วที่สุดในการลบหลายแถวในไฟล์คืออะไร?


12

ฉันต้องการใช้เครื่องมือแก้ไข Vi เพื่อลบหลายแถวในไฟล์ โปรดแจ้งแนวคิดหรือข้อเสนอแนะให้ฉัน

เป้าหมายของฉันเป็นเช่นนี้:

ก่อน:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.
.
29
30
.
.

หลังจาก;

1
10
20
30
40
.
.

3
คุณจะเลือกแถวที่จะลบได้อย่างไร คุณต้องการออกไปหนึ่งแถวทุก ๆ 10 หรือไม่?
matzeri

1
คุณสามารถลบช่วงของบรรทัดด้วย:[range]dเช่น:3,5dลบบรรทัดที่สามถึงห้า (รวม)
Bratchley

6
นอกจากนี้ยังมีvi.stackexchange
Alexey

@R Ketkaew - คุณพยายามที่จะลบรายการของตัวเลขหรือแถว? คุณช่วยอัพเดทคำถามของคุณให้กระจ่างได้ไหม
DarkHeart

ฉันรู้ว่าคุณกำลังถามเกี่ยวกับ Vi แต่คุณสามารถทำได้กับ GNU Sed ด้วยเช่นกัน:gsed -n '1p; 0~10p'
shadowtalker

คำตอบ:


17

หากคุณต้องการเก็บทุกบรรทัดที่ 10 และลบส่วนที่เหลือ:

%norm 9ddj

คำอธิบาย:

% ไฟล์ทั้งหมด

norm รันคำสั่งต่อไปนี้ใน "โหมดปกติ"

9dd ลบ 9 บรรทัด

j เลื่อนลงหนึ่งบรรทัด (เช่นเก็บไว้)

หมายเหตุ:นี่จะเป็นการลบแถวแรก

ดัดแปลงมาจากhttp://www.rayninfo.co.uk/vimtips.html


หรือใช้คำสั่งโกลบอล:

  • ทำซ้ำบรรทัดแรก ggYP
  • :g/^/+ d9

ดัดแปลงมาจาก/programming/1946738/vim-how-to-delete-every-second-row


หรือคุณสามารถใช้awk:

%!awk 'NR \% 10 == 0 || NR == 1'

คำสั่ง awk ใช้งานได้สำหรับฉัน ผมคิดเสมอว่าต้อง awk {...}น้อยหนึ่งบล็อก ดีที่รู้ว่าคุณทำไม่ได้ มันเป็นคำสั่ง awk แบบไม่ธรรมดาตัวแรกที่ฉันได้ทำงาน!
the_velour_fog

1
@the_velour_fog ต้องมีการบล็อก หากคุณไม่ได้เขียนใคร AWK จะทำตัวเหมือนคุณเขียนไว้{ print $0 }
shadowtalker

@RKetkaew ตัวเลือกใดที่คุณใช้ หากการตอบสนองแก้ไขคำถามของคุณโปรดคลิกที่เครื่องหมายเพื่อทำเครื่องหมายเป็นคำตอบ
underscore_d

@underscore_d สวัสดีฉันใช้คำสั่งที่แนะนำจาก DarkHeart ขอบคุณสำหรับความคิดเห็นของคุณ
rangsiman

12
:2,$v/0$/d

ลบบรรทัดที่ไม่สิ้นสุดโดย0เริ่มจากบรรทัดที่สอง


2
นี่คือทางออกที่ฉลาด ฉันต้องการเพียงแค่เพิ่มคำอธิบายว่า2,$เป็นช่วงและคำสั่ง อยู่ที่ไหนregex และคำสั่ง ex ที่จะทำงานในทุกบรรทัดที่ไม่ตรงกัน v/0$/dg!0$d
grochmal
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.