การค้นหาเชิงโต้ตอบ / แทนที่ regex ในกลุ่ม?


265

ฉันรู้ว่า regex สำหรับการทำทดแทนระดับโลก

     %s/old/new/g

คุณจะทำการค้นหาแทนที่แบบโต้ตอบในVim ได้อย่างไร?

คำตอบ:


462

เพิ่มแฟล็กc (ในพร้อมต์คำสั่ง vim):

:%s/old/new/gc

จะให้พรอมต์ใช่ / ไม่ใช่เมื่อเกิด 'เก่า' ในแต่ละครั้ง

"เก่า" ถูกเน้นในข้อความ  ที่ด้านล่างของหน้าต่างว่า "แทนที่ด้วยใหม่ (y / n / a / q / l / ^ E / ^ y)?"

ความช่วยเหลือในตัวของ Vim ให้ข้อมูลที่เป็นประโยชน์เกี่ยวกับตัวเลือกที่มีให้เมื่อเลือกการทดแทนพร้อมการยืนยัน ใช้:

:h :s

จากนั้นเลื่อนไปที่ส่วนบนตัวเลือกการยืนยัน ภาพหน้าจอด้านล่าง:

ข้อความที่ระบุว่า "[C] ยืนยันการแทนที่แต่ละรายการ [... ] CTRL-Y เพื่อเลื่อนหน้าจอลง"

aยกตัวอย่างเช่นเพื่อทดแทนนี้และทุกแมตช์ที่เหลือการใช้งาน


30
+1 ฉันเรียนรู้สิ่งใหม่วันนี้! เป็นกลุ่มมีความลับที่ซ่อนอยู่จำนวนมากดังนั้น .. :)
มาร์ค Novakowski

10
การเรียนรู้คำสั่ง vim นั้นเหมือนกับการเล่น Nethack คุณไม่มีทางรู้ว่าสิ่งมหัศจรรย์ที่ตัวละครตัวเดียวกำลังจะถืออยู่คืออะไร
Mark Biek

22
ฉันคิด "C" สำหรับ "ยืนยัน"
matpie

8
ฉันไม่ได้พยายามที่จะเจอกับสิ่งที่น่ารังเกียจ แต่ก็พบได้ทั้งหมดด้วยการทำ ": help: s" ซึ่งจะทำให้คุณตรงไปที่ ": ช่วย: s_flags"
Jeremy Cantrell

13
@ jeremy: ต้องรู้ว่ามีคำสั่ง help อยู่และรู้ว่าจำเป็นต้องพิมพ์ "colon s" เพื่อนำคุณไปยังไฟล์ช่วยเหลือที่เกี่ยวข้อง คนเราจะเรียนรู้ได้อย่างไรหรือที่ไหน?
Dennis

79

Mark Biek ชี้โดยใช้:

%s/old/new/gc

สำหรับการค้นหาทั่วโลกแทนที่ด้วยการยืนยันสำหรับการทดแทนแต่ละครั้ง แต่ฉันยังสนุกกับการตรวจสอบการโต้ตอบว่าข้อความเก่าจะถูกต้องตรงกัน ฉันทำการค้นหาด้วย regex ก่อนจากนั้นฉันจะใช้รูปแบบนั้นซ้ำ:

/old.pattern.to.match
%s//replacement/gc

s//จะใช้รูปแบบการค้นหาล่าสุด


9
หนึ่งในสิ่งที่ยิ่งใหญ่ที่สุดเกี่ยวกับการใช้ / การเรียนรู้เป็นกลุ่มคือความลึกของหลุมกระต่าย!
เคน

2
ดีฉันทำการค้นหาอยู่เสมอจากนั้นใช้ <Cr> / เพื่อวางการค้นหาล่าสุดลงในคำสั่งทดแทน
Atilla Filiz

สิ่งที่ฉันพลาดจาก Sublime Text แน่นอน!
Xenofex

คำตอบนี้มีประโยชน์อย่างยิ่งเมื่อฉันนึกภาพหลายครั้งที่คุณตัดสินใจแทนที่อินสแตนซ์ของคำเป็นคำที่คุณค้นหา
M_M

20

ฉันคิดว่าคุณกำลังมองหาcเช่นs/abc/123/gcนี้จะทำให้ VIM ยืนยันการเปลี่ยน โปรดดู: ความช่วยเหลือ: ใช้แทนข้อมูลเพิ่มเติม


9

ฉันมักจะใช้คำสั่ง find / replace / next / repeat :-)

/old<CR>3snew<ESC>n.n.n.n.n.n.n.

ว่าfind "old", substitute 3 characters for "new", find next, repeat substituteและอื่น ๆ

มันเป็นความเจ็บปวดสำหรับการทดแทนครั้งใหญ่ แต่มันช่วยให้คุณเลือกที่จะไม่สนใจเหตุการณ์เก่า ๆ บางอย่าง (เพียงแค่กดnอีกครั้งเพื่อค้นหาสิ่งต่อไปแทนที่จะ.ทำซ้ำแทน)


ฉันใช้สิ่งนี้เช่นกันสำหรับข้อความที่คล้ายกัน (. 3cW <texthere> <ESC> <ย้ายไปยังตำแหน่งใหม่> <ย้าย> <ย้าย>..)
strager

1
มันไม่ใช่ปฏิปักษ์! มันหวาน. และคุณสามารถค้นหาในทิศทางตรงกันข้ามโดยใช้ N ดีจริง ๆ ถ้าคุณเห็นคำและต้องการเปลี่ยน * cwNewText <ESC> Nnn (ซึ่งจะกระโดดออกไปจากคำว่าภายใต้เคอร์เซอร์ แต่แล้วกระโดดกลับทันทีที่คุณมีการเปลี่ยนแปลงเกิดขึ้นต่อไป.
PEZ

คือ<CR>อะไร
2560

9

หากคุณเพียงแค่ต้องการที่จะนับจำนวนของการเกิดขึ้นของ 'abc' %s/abc//gnจากนั้นคุณสามารถทำ สิ่งนี้ไม่ได้แทนที่สิ่งใด แต่เพียงรายงานจำนวนการเกิดของ 'abc'


3

หากความต้องการทดแทนข้อความของคุณไปเปลี่ยนสำหรับแต่ละเกิดการจับคู่ (เช่นไม่เพียงแค่เลือก Yes / No เพื่อนำไปใช้ทดแทนเอกพจน์) คุณสามารถใช้เป็นกลุ่มปลั๊กอินที่ผมทำเรียกว่าโต้ตอบแทนที่


2

ตอนนี้Neovimมีคุณสมบัติที่จะแสดงตัวอย่างการทดแทน:

ป้อนคำอธิบายรูปภาพที่นี่

ภาพที่นำมาจาก: https://medium.com/@eric.burel/stop-using-open-source-5cb19baca44d เอกสารของคุณสมบัติ: https://neovim.io/doc/user/options.html# 'inccommand'


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