ฉันจะเพิ่มสตริงที่ส่วนท้ายของแต่ละบรรทัดใน Vim ได้อย่างไร?


256

ฉันต้องการเพิ่ม*ที่ส่วนท้ายของแต่ละบรรทัดใน Vim

ฉันลองใช้รหัสไม่สำเร็จ

:%s/\n/*\n/g

ขอแสดงความไม่ได้เพราะอยู่ทางด้านขวามือของ:s///, \nสอดคล้องกับตัวละครโมฆะ ส่วนที่:help sub-replace-specialเกี่ยวข้อง
doubleDown

คำตอบ:


354

:%s/$/\*/g

ควรทำงาน. ดังนั้นควร:%s/$/*/gเป็นMrWigglesชี้ให้เห็นอย่างถูกต้อง


มีวิธีแทรก ' ' ที่คอลัมน์เดียวกันเนื่องจากทุกบรรทัดไม่ยาวเท่ากันดังนั้นบรรทัดที่ 1 อาจมี ' ' ที่คอลัมน์ที่ 15 แต่บรรทัดที่ 2 มี '*' ที่คอลัมน์ที่ 25
Aman Jain

11
มีเพียง 1 EOL ต่อบรรทัดดังนั้นการgตั้งค่าสถานะจึงไม่จำเป็น
doubleDown

ฉันต้องการเพิ่ม / เริ่มต้นของแต่ละบรรทัด: 1, $ s / ^ / \ / g ทำงานให้ฉัน
farooqsadiq

@dirkgently ฉันจะส่งผ่านตัวแปรสตริงเป็นอาร์กิวเมนต์ไปยังคำสั่งนี้ (คุณรู้แทน *) ได้อย่างไร
Matheus Rotta

353

แม้สั้นกว่าคำสั่ง: การค้นหา:

:%norm A*

นี่คือความหมาย:

 %       = for every line
 norm    = type the following commands
 A*      = append '*' to the end of current line

28
มนุษย์ไม่มีกระทู้ vi หรือกลุ่มที่ฉันไม่ได้เรียนรู้บางสิ่งบางอย่าง วันนี้ฉันเรียนรู้เกี่ยวกับบรรทัดฐาน และอย่างที่พวกเขาพูดที่ไชโย "เรื่องปกติ"
smcameron

4
สำหรับการสรุปคุณเพียงแค่ใช้ 0i *, 0 จะนำคุณไปยังจุดเริ่มต้นของบรรทัด i สำหรับโหมดแทรกและ * สำหรับ * D:
Rob

7
ในฐานะVimGolferฉันไม่สามารถช่วยได้ แต่เพิ่มว่าการใช้I*มากกว่า0i*จะช่วยคุณประหยัดหนึ่งการกดแป้น
Jedidiah Hurt

24
อีกหนึ่งเคล็ดลับ:ใช้ได้กับช่วงเช่นกัน เพียงแค่ไฮไลท์บรรทัดในโหมดภาพและกด:สิ่งนี้จะเติมคำสั่งล่วงหน้า:'<,'>ที่คุณสามารถทำได้:'<,'>norm A*
Jedidiah Hurt

8
สำหรับการเตรียมใช้Iแทน -:%norm I*
เพียงแค่โชคดีจริงๆ

42

นอกจากนี้:

:g/$/norm A*

นอกจากนี้:

gg<Ctrl-v>G$A*<Esc>

Ahhh ... อันที่สองสามารถใช้กับการเลือกบรรทัดได้เช่นกัน ดี!
ทิมเฟลตเชอร์

คุณช่วยอธิบายตัวอย่างแรกได้ไหม
โคดี้โพล

@CodyPoll gเป็นglobalคำสั่งที่ทำบางสิ่งบางอย่างกับทุกบรรทัดที่ตรงกัน $ตรงกับทุกบรรทัด มันอาจจะยังหรือ^ .*norm ดำเนินการคำสั่งที่ปกติคุณใช้ในโหมดคำสั่ง ดังนั้นA*หมายถึงผนวก*ท้ายบรรทัด
defhlt

41

ฉันคิดว่าการใช้โหมดบล็อกภาพเป็นวิธีที่ดีกว่าและหลากหลายกว่าสำหรับการจัดการกับสิ่งประเภทนี้ นี่คือตัวอย่าง:

This is the First line.  
This is the second.  
The third.

ในการแทรก "Hello world" (space + clipboard) ที่ท้ายแต่ละบรรทัดเหล่านี้:

  • บนอักขระในบรรทัดแรกกด Ctrl-V (หรือ Ctrl-Q หากวาง Ctrl-V)
  • กด jj เพื่อขยายบล็อกภาพมากกว่าสามบรรทัด
  • กด $ เพื่อขยายบล็อกภาพไปยังจุดสิ้นสุดของแต่ละบรรทัด กด A จากนั้นเว้นวรรคแล้วพิมพ์ Hello world + จากนั้นกด Esc

ผลลัพธ์คือ:

This is the First line. Hello world.  
This is the second. Hello world.  
The third. Hello world.  

(ตัวอย่างจากVim.Wikia.com )


3
แทนที่จะกดjjหนึ่งสามารถกดGเพื่อย้ายไปยังบรรทัดสุดท้าย สิ่งนี้มีประโยชน์ในไฟล์ขนาดใหญ่โดยที่การกดjจนกว่าคุณจะกดบรรทัดสุดท้ายก็ใช้ไม่ได้
แนช

ยอมรับว่าบล็อกที่มองเห็นนั้นสะอาดที่สุดที่นี่และสามารถขยายได้มากขึ้นเช่นกัน
Peter Dolan

โปรดทราบว่าสิ่งนี้ดูเหมือนจะไม่ทำงานในทุกบรรทัดในตอนแรก แต่หลังจากที่คุณกด Esc มันจะผ่านและเพิ่มให้กับทุกคน
Noumenon

Visual Block ทำให้เกิดปัญหาและข้อผิดพลาดเมื่อใช้ vim เป็นส่วนเสริมสำหรับสิ่งอื่น ๆ เช่น VS Code ในกรณีดังกล่าวการค้นหาและแทนที่ผู้ใช้ดั้งเดิมที่ขอคือตัวเลือกที่เชื่อถือได้
Brett

ตรวจสอบให้แน่ใจว่าคุณใช้ตัวพิมพ์ใหญ่ A ตัวพิมพ์เล็ก "a" ไม่ทำงาน
Jeff Hoye

14

หากคุณต้องการเพิ่ม Hello world ในตอนท้ายของแต่ละบรรทัด:

:%s/$/HelloWorld/

หากคุณต้องการทำสิ่งนี้สำหรับจำนวนบรรทัดที่ระบุจาก 20 ถึง 30 ใช้:

:20,30s/$/HelloWorld/

หากคุณต้องการทำสิ่งนี้ในตอนเริ่มต้นของแต่ละบรรทัดให้ใช้:

:20,30s/^/HelloWorld/

6

คุณไม่ต้องการจริงๆgในตอนท้าย ดังนั้นมันจะกลายเป็น:

:%s/$/*

หรือถ้าคุณแค่อยากให้*พูดบรรทัดที่ 14-18:

:14,18s/$/*

หรือ

:14,18norm A*


5

ทางเลือกหนึ่งคือ:

:g/$/s//*

*นี้จะได้พบกับทุกสมอปลายสายและแทนด้วย ฉันพูดว่า "ตัวแทน" แต่อันที่จริงแล้วมันเป็นเรื่องที่เพิ่มเติมเนื่องจากสมอเป็นสิ่งพิเศษมากกว่าตัวละครปกติ สำหรับข้อมูลเพิ่มเติมโปรดดูที่พลังของกรัม - ตัวอย่าง


s // หมายถึงอะไรใน regex ฉันรู้คำสั่งที่คล้ายกัน: g / / / p, (grep) ฉันค่อนข้างมั่นใจว่าคำสั่งของคุณใกล้กับฉันอย่างน้อยก็ในโครงสร้าง
LéoLéopold Hertz 준영

1
s เป็นตัวแทน - มันแทนที่ส่วนท้ายของจุดยึดบรรทัดด้วยเครื่องหมายดอกจัน (ดีไม่ได้แทนที่จริง ๆ เพราะมันเป็นจุดยึด)
paxdiablo

3
:% s / \ n / * \ r / g

คนแรกของคุณถูกต้องที่อื่น แต่ Vim ต้องมีการจัดการขึ้นบรรทัดใหม่ที่แตกต่างกันด้วยเหตุผลบางประการ


ในเวอร์ชัน Vim \ n ของฉันทำงานได้ แต่สิ่งนี้จะแทนที่ newline ด้วย * ซึ่งเป็นการรวมกลุ่มอย่างมีประสิทธิภาพ
นาธาน Fellman

1
คำสั่งนี้ได้รับการยืนยันว่าทำงานได้ดีใน Vim ทุกรุ่นที่ฉันได้ลอง คุณใช้เวอร์ชั่น windows หรืออะไรบางอย่าง?

1
%s/\s*$/\*/g

นี่จะเป็นการหลอกลวงและทำให้แน่ใจว่าไม่มีการเว้นวรรคนำหน้า

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