ฉันจะเข้าร่วมสองบรรทัดใน vi ได้อย่างไร


169

ฉันมีสองบรรทัดในไฟล์ข้อความเหมือนด้านล่าง:

S<Switch_ID>_F<File type>
_ID<ID number>_T<date+time>_O<Original File name>.DAT

ฉันต้องการผนวกสองบรรทัดใน vi เช่นด้านล่าง:

S<Switch_ID>_F<File type>_ID<ID number>_T<date+time>_O<Original File name>.DAT

บรรทัดที่สองถูกลบและเนื้อหาของบรรทัดที่สองถูกต่อท้ายบรรทัดแรก

ฉันจะใช้โหมดคำสั่งใน vi ได้อย่างไร

คำตอบ:


310

Shift+ Jลบอักขระการเปลี่ยนแปลงบรรทัดจากบรรทัดปัจจุบันดังนั้นโดยการกด "J" ที่ใดก็ได้ในบรรทัดคุณสามารถรวมบรรทัดปัจจุบันและบรรทัดถัดไปในแบบที่คุณต้องการ


9
ตัวพิมพ์ใหญ่ J เข้าร่วมบรรทัดตัวพิมพ์เล็กเลื่อนเคอร์เซอร์

4
นั่นคือเมืองหลวง J ไม่ใช่ตัวพิมพ์เล็ก J; ดังนั้น Shift-J
Jonathan Leffler

28
"ลบอักขระการเปลี่ยนบรรทัดออกจากบรรทัดปัจจุบัน" เป็นวิธีที่ค่อนข้างงุ่มง่ามในการอธิบายสิ่งที่ J ทำและยังไม่ถูกต้องจริงๆ J "รวม" บรรทัดนี้เป็นบรรทัดถัดไป ในกระบวนการมันจะทำการลบ newline แต่ยังจัดการกับช่องว่างด้วยวิธีอื่น
ลอเรน Gonsalves

5
ฮ่าฮ่า GJในvimจะย้ายไปที่บรรทัดสุดท้ายแล้วลองเข้าร่วมกับบรรทัดถัดไปที่เดียวที่คำสั่งเข้าร่วมไม่เข้าท่า ใช่ฉันพบนี้ :-) ตลก
Alok สิงคาล

2
ฉันยังไม่ทราบว่าฉันต้องใช้ StackOverflow เพื่อเข้าร่วมสองบรรทัดโดยใช้โปรแกรมแก้ไขนี้!
Manitra Andriamitondra

59

Vi หรือกลุ่ม?

อย่างไรก็ตามคำสั่งต่อไปนี้ใช้งานได้สำหรับ Vim ในโหมด 'ที่เข้ากันไม่ได้' นั่นคือฉันคิดว่า vi บริสุทธิ์เกือบทั้งหมด

:join!

ถ้าคุณต้องการที่จะทำจากการใช้คำสั่งปกติ

gJ

ด้วย 'gJ' คุณจะเข้าร่วมรายการต่างๆตามที่เป็น - โดยไม่ต้องเพิ่มหรือลบช่องว่าง:

S<Switch_ID>_F<File type>
_ID<ID number>_T<date+time>_O<Original File name>.DAT

ผลลัพธ์:

S<Switch_ID>_F<File type>_ID<ID number>_T<date+time>_O<Original File name>.DAT

ด้วยคำสั่ง 'J' คุณจะมี:

S<Switch_ID>_F<File type> _ID<ID number>_T<date+time>_O<Original File name>.DAT

หมายเหตุช่องว่างระหว่างและtype>_ID


2
เพียงแค่ต้องการชี้ให้เห็นว่าใช้g/pattern/joinงานได้ใน VIM ในขณะที่g/pattern/Jไม่ทำงาน อาจช่วยคนในอนาคต
jisaacstone

ฉันชอบที่คุณเข้าร่วมกับรูปแบบ แต่มันเข้าร่วมสองบรรทัดที่มีพื้นที่สีขาว ยังไงก็ตามที่จะเข้าร่วมสองบรรทัดที่มีลวดลายโดยไม่มีช่องว่าง
David.Chu.ca

g / รูปแบบ / เข้าร่วม! ดูเหมือนว่าจะทำอย่างนั้น
fortboise

1
มันซับซ้อนกว่านี้ได้ไหม! :-)
Johannes Overmann

22

สิ่งนี้ควรทำ:

J


6
'J' ให้พื้นที่เพิ่มเติมในขณะที่เข้าร่วมสาย
Maxim Kim

3
@MaximKim: และนี่คือเหตุผลที่ โปรดทราบว่า:h Jจะบอกวิธีปิดใช้งานคุณสมบัตินั้น
ereOn

2
ใช้gJถ้าคุณไม่ต้องการให้กลุ่มเพิ่มช่องว่างเมื่อเข้าร่วมรายการ
qwertzguy

17

ใน vi, J(นั่นคือShift+ J) หรือ:joinควรทำสิ่งที่คุณต้องการเป็นส่วนใหญ่ โปรดทราบว่าพวกเขาปรับช่องว่าง โดยเฉพาะอย่างยิ่งคุณจะพบช่องว่างระหว่างสองบรรทัดที่เข้าร่วมในหลายกรณีและหากบรรทัดที่สองถูกเยื้องที่การเยื้องจะถูกลบออกก่อนที่จะเข้าร่วม

ในกลุ่มคุณยังสามารถใช้gJ( Gแล้วShift+ J) :join!หรือ สิ่งเหล่านี้จะเข้าร่วมบรรทัดโดยไม่ต้องทำการปรับปรุงช่องว่างใด ๆ

ในกลุ่มให้ดู :help Jข้อมูลเพิ่มเติม


หนึ่งข้อแม้เมื่อใช้gJและJเป็นทั้งที่เปลี่ยนเคอร์เซอร์ไปที่จุดเชื่อมต่อ แต่:join!และ:joinไม่
SergioAraujo

4

เพียงแทนที่ " \n" ด้วย ""

ใน vi / Vim สำหรับทุกบรรทัดในเอกสาร:

%s/>\n_/>_/g

หากคุณต้องการยืนยันการเปลี่ยนทุกครั้ง:

%s/>\n_/>_/gc

3

หากคุณต้องการเข้าร่วมสายที่เลือก (คุณอยู่ในโหมดภาพ) จากนั้นเพียงกด gJเพื่อเข้าร่วมสายของคุณโดยไม่ต้องเว้นวรรคใด ๆ

นี้มีการอธิบายในรายละเอียดมากขึ้นในเว็บไซต์ VI / กลุ่มกองแลกเปลี่ยน


1

กดShift+ 4("$") ในบรรทัดแรกจากนั้นกด Shift+ j("J")

และถ้าคุณต้องการความช่วยเหลือเข้าไปใน vi F1แล้วกด


3
$ ย้ายไปยังจุดสิ้นสุดของแถว แต่ไม่จำเป็นสำหรับ J

1
คุณไม่จำเป็นต้องอยู่ท้ายบรรทัดเพื่อให้ J เข้าร่วมรายการ
Jonathan Leffler

1
การกด $ ไม่จำเป็นจริงๆ
ลอเรนซ์ Gonsalves

1
@laurence. การกด $ ทำให้มั่นใจได้ว่าเคอร์เซอร์วางอยู่ข้างๆกฎบัตรบรรทัดใหม่และนี่เป็นสิ่งที่ต้องทำ
วีเจย์


1

อีกวิธีในการเข้าร่วมสองบรรทัดโดยไม่ต้องวางเคอร์เซอร์ไว้ที่บรรทัดนั้นคือ:

:6,6s#\n##

ที่นี่ 6 คือหมายเลขบรรทัดที่อีกสายหนึ่งจะเข้าร่วม :set nuหากต้องการแสดงหมายเลขบรรทัดใช้

หากเราอยู่บนเคอร์เซอร์ที่ควรเข้าร่วมบรรทัดถัดไปดังนั้น:

:s#\n##

ในทั้งสองกรณีเราไม่จำเป็นต้องgชอบ:s#\n##gเพราะในหนึ่งบรรทัดเพียงคนเดียว\nที่มีอยู่


มันง่ายกว่าที่จะใช้Shift+Vเพื่อเลือกบรรทัดทั้งหมดที่จะเข้าร่วมยกเว้นบรรทัดสุดท้ายจากนั้น:'<,'>s/\n/, /ในตัวอย่างนี้การเข้าร่วมบรรทัดในขณะที่ใส่เครื่องหมายจุลภาคและช่องว่างที่ท้ายแต่ละบรรทัด โปรดทราบว่าเมื่อมีการเลือกบางสิ่งและเราพิมพ์:ในโหมดปกติแล้ว'<,'>จะปรากฏบนบรรทัดคำสั่งโดยอัตโนมัติ
Evgeni Sergeev

เหมาะสำหรับการเข้าร่วมหลายบรรทัดที่เลือกพร้อมตัวคั่นที่ต้องการ พบหนึ่งพิมพ์ ... ในโหมดปกติหรือในโหมดภาพ?
vusan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.