ฉันจะลบบรรทัดทั้งหมดในไฟล์โดยใช้ vi ได้อย่างไร


269

ฉันจะลบบรรทัดทั้งหมดในไฟล์โดยใช้ vi ได้อย่างไร

ในตอนนี้ฉันใช้วิธีนี้เพื่อลบบรรทัดทั้งหมดในไฟล์:

echo > test.txt

ฉันจะลบบรรทัดทั้งหมดโดยใช้ได้viอย่างไร

หมายเหตุ: การใช้งานddไม่ใช่ตัวเลือกที่ดี สามารถมีได้หลายบรรทัด


5
ฉันคิดว่า dG ควรใช้งานได้
MadTux

11
@ MadTux เฉพาะเมื่อคุณเริ่มต้นในบรรทัดแรก 1GdGจะทำงานได้จากทุกที่
Holloway

1
echo | test.txtไม่ใช่คำสั่งที่ถูกต้องยกเว้นว่าtest.txtเป็นสคริปต์ที่สามารถเรียกทำงานได้ ฉันเดาว่าคุณหมายถึงอะไรecho >test.txtแทน?
tripleee

คุณถูกต้อง @tripleee
เย็น

5
โปรดทราบว่าไม่ได้ใช้vi, >test.txtจะเพียงพอที่จะตัดมันยาวเป็นศูนย์ - ไม่echoจำเป็น
abligh

คำตอบ:


473

ในการviทำ

:1,$d

เพื่อลบทุกบรรทัด

:แนะนำคำสั่ง (และย้ายเคอร์เซอร์ไปที่ด้านล่าง) ข้อบ่งชี้ของการที่สายคำสั่งต่อไป (เป็น) ควรจะทำงานใน ในกรณีนี้ช่วงจากบรรทัดหนึ่งถึงบรรทัดสุดท้าย (ระบุโดยดังนั้นคุณไม่จำเป็นต้องทราบจำนวนบรรทัดในเอกสาร) สุดท้ายหมายถึงการลบบรรทัดที่ระบุ
1,$d$
d

มีรูปแบบที่สั้นกว่า ( :%d) แต่ฉันพบว่าตัวเองไม่เคยใช้มัน :1,$dสามารถได้อย่างง่ายดายมากขึ้น "ดัดแปลง" เพื่อเช่น:4,$-2dเหลือเพียง 3 ครั้งแรกและครั้งสุดท้าย 2 สายการลบส่วนที่เหลือ


9
เคล็ดลับโปร ไม่มีอีกแล้วESC+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd...
rdev5

2
@ rdev5 ลอง.ครั้งต่อไปเพื่อทำซ้ำคำสั่ง
Gazihan Alankus

169

ใน vi ฉันใช้

:%d

ที่ไหน

  • : บอกให้ vi เข้าสู่โหมดคำสั่ง
  • % หมายถึงทุกบรรทัด
  • d : ลบ

บนบรรทัดคำสั่ง

> test.txt

จะทำยัง

ปัญหาเกี่ยวกับววคืออะไร?

dd if=/dev/null of=test.txt

ที่ไหน

  • /dev/null เป็นไฟล์พิเศษ 0 ไบต์
  • if เป็นไฟล์อินพุต
  • of เป็นไฟล์ ouput

ฉันคิดว่าการใช้ddฉันต้องการ pess สำหรับทุกบรรทัดในไฟล์
เย็น

ดี. มันง่ายกว่าที่ผมคาดไว้ ...
เย็น

11
คุณต้องแยกความแตกต่างระหว่างddคำสั่ง vi (ซึ่ง OP หมายถึง) และddยูทิลิตี้ที่คุณให้ตัวอย่าง นอกจากนี้> test.txtอาจไม่ทำงานอย่างที่คาดไว้ในเปลือกที่ไม่ใช่ bash (เช่น zsh)
ทำให้หมดกำลังใจ

1
@depquid Oups! ตอนนี้ผมมาคิดว่ามัน ...
Archemar

2
หรือ: >test.txtนานกว่านั้นเพียงเล็กน้อย
tripleee

53

ฉันขอแนะนำให้คุณทำเช่นนี้ (ควรทำงานในเปลือกที่สอดคล้องกับ POSIX ใด ๆ ):

> test.txt

หากคุณต้องการทำกับ vi จริงๆคุณสามารถทำได้:

  • 1G (ไปที่บรรทัดแรก)
  • dG (ลบไปยังบรรทัดสุดท้าย)

30
@Cold: ... ครั้งเดียว
Chris Down

5
Gแสดงถึงบรรทัดสุดท้าย หากคุณอยู่ในบรรทัดแรก ( gg) ให้dGบอกให้ vi ลบบรรทัดทั้งหมดออกจากบรรทัดปัจจุบัน (บรรทัดแรก) ไปที่บรรทัดสุดท้าย ดังนั้นคุณทำได้ในนัดเดียว
unxnut

6
ggเป็นกลุ่มเฉพาะ มันเป็น1Gแบบดั้งเดิม vi
Stéphane Chazelas

1
ไวยากรณ์เชลล์ของคุณขึ้นอยู่กับการกำหนดค่าสำหรับเชลล์บางตัว ทั้งเชลล์แบบโต้ตอบ bash และ zsh (zsh โดยค่าเริ่มต้น) สามารถรออินพุตใน STDIN หลังจากได้รับคำสั่งนั้นและ <CTRL> + D เพิ่มเติมจำเป็นต้องเคลียร์ไฟล์จริง ความสามารถในการทำงานที่ขึ้นอยู่กับการตั้งค่า CLOBBER >| test.txt < /dev/nullค่อนข้างแข็งแกร่งมากขึ้นเพราะมันจะอุดตันไฟล์และหลีกเลี่ยงการรออินพุตบนเทอร์มินัลแบบโต้ตอบ
Caleb

1
@Caleb: อย่างที่ฉันบอกไปในเชลล์ที่สอดคล้องกับ POSIX :-) ทั้งสองสถานการณ์นั้นไม่ได้มีการร้องเรียน POSIX
Chris Down

28

หากเคอร์เซอร์ของคุณอยู่ที่บรรทัดแรก (หากไม่ใช่ให้พิมพ์: ggหรือ1G) จากนั้นคุณก็สามารถใช้งานdGได้ มันจะลบทุกบรรทัดจากบรรทัดปัจจุบันไปยังจุดสิ้นสุดของไฟล์ ดังนั้นเพื่อให้แน่ใจว่าคุณจะลบบรรทัดทั้งหมดออกจากไฟล์คุณอาจผสมทั้งสองเข้าด้วยกันซึ่งจะเป็น: ggdG(ในขณะที่อยู่ในโหมดคำสั่ง)

หรือ%dในโหมด Ex vim +%d foo.barตัวอย่างบรรทัดคำสั่ง:

ที่เกี่ยวข้อง: ฉันจะลบข้อความทั้งหมดใน VIM จากบรรทัดปัจจุบันไปยังจุดสิ้นสุดไฟล์ได้อย่างไร


3
+1 สำหรับการยศาสตร์มากกว่า: 1, $ d ไม่ใช่ว่านิ้วของเราไม่ได้ถูกต่อสายเพื่อพิมพ์โคลอนตลอดเวลาตอนนี้;)
Aaron R.

2
upvoted dGเป็นสิ่งที่ฉันมักจะใช้
lunchmeat317

1
ฉันพบนี้ ( ggdG) วิธีที่ง่ายที่สุดในกลุ่ม เหตุผลที่คำตอบนี้ไม่ได้ถูกยกระดับเนื่องจากผู้อื่นนั้นggไม่มีอยู่จริงใน vi บริสุทธิ์?
thameera

27

ฉันเป็นคนขี้เกียจและฉันชอบที่จะทำให้มันง่าย ggdGคือการกดแป้นห้าครั้งรวมถึงShift

ggไปที่บรรทัดแรกในไฟล์dคือการเริ่มต้นของdคำกริยา elete และGเป็นการเคลื่อนไหวเพื่อไปที่ด้านล่างของไฟล์ จริงๆแล้วมันเป็นจุดเริ่มต้นของไฟล์และลบทุกอย่างจนกระทั่งถึงไทล์


rsrs ฉันขี้เกียจเกินไปและใช้:$dหรือ:1,$dเป็นวิธีที่เร็วขึ้น (ฉันเขียนตัวอักษรน้อยกว่า) kkk
Cold

3
:%dเป็นทางเลือกที่ดีเนื่องจากคุณใช้การกดแป้นเพียง 5 ครั้งเท่านั้นเช่นกัน
TankorSmash

1
@TankorSmash ggเป็นคำสั่งไม่ได้vim vi
kyrias

จับที่ดีความผิดพลาดของฉัน
TankorSmash


5

ฉันมักจะใช้ ggVG

  • gg ข้ามไปที่จุดเริ่มต้นของไฟล์แก้ไขปัจจุบัน
  • V(ตัวพิมพ์ใหญ่ v) จะเลือกบรรทัดปัจจุบัน ในกรณีนี้บรรทัดแรกของไฟล์แก้ไขปัจจุบัน
  • G(g ตัวพิมพ์ใหญ่) จะข้ามไปยังจุดสิ้นสุดของไฟล์ ในกรณีนี้เนื่องจากฉันเลือกบรรทัดแรกGจะเลือกข้อความทั้งหมดในไฟล์นี้

จากนั้นคุณสามารถกดdหรือxเพื่อลบบรรทัดทั้งหมด


หากคุณใช้ในdแนวตั้งจะใช้ linewise โดยอัตโนมัติ dlลบอักขระทางด้านขวาdjตัวอย่างเช่นลบบรรทัดลง
TankorSmash

3

โปรดทราบว่าในคำถามของคุณecho > test.txtสร้างไฟล์ที่มีตัวแบ่งบรรทัดเดียวไม่ใช่ไฟล์ว่าง

จากเปลือกพิจารณาใช้หรือecho -n > test.txt: > test.txt

ในขณะที่ฉันมักจะใช้คำสั่งแก้ไข vi (ฉันใช้ggdG) คุณยังสามารถโทรออกไปยังเปลือกที่มีการอ้างอิงถึงไฟล์ปัจจุบันดังนี้:

:!:>%

มันเกือบจะกระชับggdGแต่พิมพ์ยากกว่าและคุณต้องยืนยันว่าคุณต้องการโหลดไฟล์ที่แก้ไขใหม่ดังนั้นฉันจึงไม่แนะนำให้ใช้ในกรณีนี้โดยเฉพาะ แต่รู้วิธีใช้คำสั่งเชลล์จาก vi เช่นนี้ มีประโยชน์

ทำลายมันลง:

  • : เริ่มต้นคำสั่ง vi
  • ! เริ่มต้นคำสั่งเชลล์
  • : นี่เป็นคำสั่ง shell builtin ที่มีเอาต์พุตว่าง
  • > เปลี่ยนเส้นทางการส่งออก
  • % vi จะแทนที่สิ่งนี้ด้วยชื่อของไฟล์ปัจจุบัน

ข้อเสนอแนะ:1,$dก็เป็นหนึ่งในหลักสูตรที่ดีเช่นกันและในขณะที่ฉันอยู่ที่นั่นก็มีเช่นกัน1GdG


:!:>%นอกจากนี้ยังมีอันตรายเช่นกันหากviไม่ยกเว้นชื่อไฟล์สำหรับเชลล์ (ห้ามแก้ไขเมื่อมีการแก้ไขไฟล์ที่มีชื่อ$(reboot)) คุณต้องการบางสิ่งบางอย่าง:call system(":>" . shellescape(expand("%")))
Stéphane Chazelas

3

ทางออกอื่น:

truncate -s 0 file

ไม่ง่ายกว่านี้จริง ๆ>fileแต่ก็โอเค
phk

1
ดูเหมือนว่าจะเป็นวิธีที่ดี แต่เป้าหมายกำลังทำอยู่โดยใช้ vi Tks
เย็น


-1

คุณสามารถใช้เคล็ดลับเพื่อลบบรรทัดจำนวนมาก ตรวจสอบให้แน่ใจว่าคุณไม่ได้อยู่ในโหมดแทรก (กด ESC) จากนั้นพิมพ์ 1000dd


1
คุณควรรวมคำอธิบายเกี่ยวกับสิ่งที่คำสั่งทำงาน / ทำงานอย่างไร (ลบ 1,000 บรรทัดถัดไปซึ่งไม่ได้ลบทุกบรรทัดหากเคอร์เซอร์ไม่อยู่ที่บรรทัดแรก)
sebasth

นี่คือเหตุผลที่ฉันเรียกมันว่าเป็นกลอุบาย :)
Radu

-1

ฉันพิมพ์ไปถึงด้านบนของเส้นและจากนั้นทำgg 100 ddสิ่งนี้จะนำตัวชี้ไปที่บรรทัดบนสุดของเครื่องมือแก้ไขและลบ 100 บรรทัดจากที่นั่น คุณอาจต้องปรับจำนวนเพื่อเพิ่มบรรทัดหากไฟล์มีความยาว


-1
> file.txt

คุณไม่ต้องเปิด vi จนกว่าคุณจะต้องการจริงๆ


1
สวัสดีและยินดีต้อนรับสู่ไซต์แลกเปลี่ยนสแต็คของ U&L โปรดตรวจสอบศูนย์ช่วยเหลือสำหรับข้อมูลเกี่ยวกับวิธีโพสต์เว็บไซต์นี้ที่ดีที่สุด เราต้องการปลูกฝังคำถามและคำตอบที่ให้ข้อมูลและไม่ซ้ำกันในเว็บไซต์นี้ คำตอบของคุณเหมือนกับคำตอบและความคิดเห็นอื่น ๆ ในโพสต์นี้ โปรดแก้ไขโพสต์ของคุณเพื่อให้ได้คำตอบที่ไม่ซ้ำใครและให้ข้อมูลมากขึ้น ขอขอบคุณ!
kemotep

นอกจากนี้ประเด็นของคำถามคือ ... "using vi"
Jeff Schaller

ฉันพยายามอย่างที่คุณแนะนำ bash: > file.txt: command not foundผมได้
roaima

@roaima "> file.txt"คุณต้องการได้รับว่าถ้าคุณพูดสิ่งที่เป็น
Kusalananda

1
@JeffSchaller : vi >file.txt ;-)
Kusalananda
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.