หนึ่งจะหลีกเลี่ยงแบ็กสแลชและสแลชไปข้างหน้าใน VIM ค้นหา / ค้นหาได้อย่างไร


99

ตัวอย่างเช่นหากฉันต้องการค้นหาและแทนที่ด้วยสตริงที่มีเครื่องหมายทับย้อนกลับหรือไปข้างหน้าสิ่งนี้จะสำเร็จเป็นกลุ่มได้อย่างไร ขอขอบคุณ!

ตัวอย่างค้นหาและแทนที่คือ: :%s/foo/bar/g

จะเป็นอย่างไรถ้าฉันต้องการค้นหาเหตุการณ์ทั้งหมด<dog/>และแทนที่ด้วย<cat\>


3
ไม่ใช่คำตอบอย่างเคร่งครัด แต่คุณควรอ่าน: help magic
Tom Morris

+1 Tom โดยทั่วไปเป็นวิธีแก้ปัญหาที่ดีที่สุดเมื่อทำงานกับ regex ที่ไม่สำคัญ
Randy Morris

@Tom @Randy อย่างไรก็ตาม ... vi --helpบนเซิร์ฟเวอร์ของฉันไม่ได้ให้คำอธิบายเกี่ยวกับการหลบหนีอักขระพิเศษ ... ซึ่งเป็นสาเหตุที่ผู้คนเข้ามาใน stackoverflow เพื่อเริ่มต้นด้วย ...
aequalsb

@aequalsb :help magicคือสิ่งที่คุณพิมพ์ภายในกลุ่ม ไม่ใช่อาร์กิวเมนต์บรรทัดคำสั่งสำหรับกลุ่ม
doubleDown

คำตอบ:


154

วิธีเดียวกับที่คุณหลีกเลี่ยงอักขระส่วนใหญ่ในโปรแกรม linuxy ด้วยแบ็กสแลช:

:%s/<dog\/>/<cat\\>

แต่โปรดทราบว่าคุณสามารถเลือกตัวคั่นอื่นแทนได้:

:%s@<doc/>@<cat\\>@

วิธีนี้ช่วยให้คุณไม่ต้องพิมพ์แบ็กสแลชที่ใช้เวลานานและสับสนในรูปแบบที่มีเครื่องหมายทับมากมาย

จากเอกสารประกอบ :

แทน/ซึ่งล้อมรอบรูปแบบและการเปลี่ยนสตริงคุณสามารถใช้ตัวอักษรตัวเดียวไบต์อื่น ๆ แต่ไม่ได้ตัวอักษรและตัวเลข, \, หรือ" |สิ่งนี้มีประโยชน์หากคุณต้องการรวม/ไว้ในรูปแบบการค้นหาหรือสตริงการแทนที่


2
ดังนั้นมันจะหาตัวคั่นที่คุณเลือกโดยอัตโนมัติ?
พายุ

13
ใช่. อักขระหลังsถูกนำไปเป็นตัวคั่น ฉันไม่รู้ว่าฉันพบรายการในเอกสารที่ไหน แต่ฉันค่อนข้างมั่นใจว่าอย่างน้อย/:;*%@#ก็ถูกต้อง
Cascabel

สิ่งนี้มีประโยชน์เมื่อแทนที่ \ เป็น / ในไฟล์ที่มีพา ธ สไตล์ Windows จำนวนมาก ขอบคุณ.
Isaac Nequittepas

หากต้องการเข้าถึงข้อความนั้นในเอกสารให้ใช้: h e146
jcollado

1
ไม่รู้เลยว่าคุณสามารถเปลี่ยนตัวคั่นได้! ขอบคุณมากค่ะ
Brettins

22
%s:<dog/>:<cat>

คุณสามารถแทนที่ / ตัวคั่นได้หากมันสร้างความรำคาญให้กับรูปแบบบางอย่าง


3
+1 สำหรับ:ตัวคั่น ฉันไม่รู้ว่าคุณสามารถใช้มันได้ ฉันมักจะใช้@ในช่วงเวลา 'Escape-Mess'
Jeffrey Jose

@JeffreyJose อักขระอะไรก็ตามที่ตามมา:sถูกกำหนดให้เป็นอักขระตัวคั่น คุณสามารถใช้อักขระที่ไม่ใช่ตัวเลขมากที่สุด ( แต่ไม่\, "หรือ|) (ที่มา )
user1857492

8

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

 :%s#<dog/>#<cat\\>#

หรือถ้าคุณต้องใช้ slash เป็นตัวคั่นคำสั่งแทน

 :%s/<dog\/>/<cat\\>/


2

ฉันกำลังมองหาสิ่งที่คล้ายกันเพื่อค้นหาค่า register ที่มี/อักขระ (เพื่อบันทึกมาโคร) วิธีแก้ปัญหาคือการค้นหาโดยใช้?โทเค็นแทน/.


โปรดทราบว่า?จะทำการค้นหาย้อนหลังและจะไม่เหมือนกัน
Martin Tournoij

-1

แบ็กสแลชเฉือนแบ็กสแลชสตาร์

/(<- the prompt)\/\*

ดังนั้นหลังจากที่คุณพิมพ์ดูเหมือนว่า

/\/\*

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