การแทนที่เครื่องหมายทับ (/) ด้วยเครื่องหมายอัศเจรีย์ (!) ในคำสั่งทดแทนหมายถึงอะไร


13

ฉันเพิ่งเห็นคำสั่งทดแทนที่ผู้เขียนมีการ/แทนที่ด้วย!เช่นนี้::s!abc!ABC!g

ฉันพยายามค้นหาเอกสารบางอย่างเกี่ยวกับการใช้งานนี้ แต่ฉันไม่พบสิ่งใดที่เกี่ยวข้อง ดังนั้นฉันจึงพยายามทดสอบด้วยตัวเองและอีกครั้งฉันไม่สามารถหาความแตกต่างที่แท้จริงระหว่างสองสัญญาณได้ นี่คือสิ่งที่ฉันพบ:

  • มันเป็นไปไม่ได้ที่จะผสม!และ/ในคำสั่ง ตัวอย่างเช่น:s!abc/ABCล้มเหลว
  • มันอาจมีประโยชน์ที่จะใช้!เพื่อหลีกเลี่ยงการหลบหนี/ในรูปแบบ ตัวอย่างเช่นถ้าผมต้องการที่จะเปลี่ยน</กับ%ฉันสามารถใช้แทน:%s!</!%!g:%s/<\//%/g
  • ดูเหมือนว่าในบางกรณี regex บางอย่างจะไม่ทำงาน/และทำงานอย่างถูกต้องด้วย!แต่ฉันไม่ได้เป็นผู้เชี่ยวชาญ regex จริงๆฉันไม่แน่ใจ

ดังนั้นคำถามของฉันเป็นเรื่องง่าย: ประโยชน์ของการใช้คืออะไร!ในคำสั่งแทนและเมื่อฉันควรจะตัดสินใจที่จะใช้มันแทน/?



แน่นอนฉันโพสต์สองครั้งโดยไม่ได้ตั้งใจฉันตั้งค่าสถานะมันไม่กี่นาทีที่ผ่านมาเพื่อทราบสิ่งที่ฉันควรทำ
statox

คำตอบ:


22

จาก:help :global:

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

ในขณะที่คุณวางแผนแล้วจากการทดลองของคุณนี้คือการป้องกันไม่ให้เรียกว่า " พิงดาวน์ซินโดรไม้จิ้มฟัน " พิจารณาสิ่งนี้:

:%s/\/home\/martin\/test/\/home\/jake\/x/

เมื่อเทียบกับ:

:%s!/home/martin/test!/home/jake/x!

เห็นได้ชัดว่าแบบฟอร์มที่สองอ่านได้มากขึ้น

นี่เป็นเหตุผลเดียวที่คุณสามารถเปลี่ยนตัวคั่น เพื่อให้มนุษย์ของเราอ่านง่ายขึ้น คอมพิวเตอร์ไม่สนใจ

โปรแกรมอื่น ๆ บางโปรแกรมนั้นมีความยืดหยุ่นมากกว่าโดยวิธีใน GNU sedเช่นคุณสามารถใช้xเป็นตัวคั่นหากคุณต้องการ เป็นเช่นเดียวกับsed sxaxbxg filesed s/a/b/g file


สำหรับความสามารถในการอ่านฉันชอบ (และแนะนำ) :%s@/home/martin/test@/home/jake/x@เนื่องจาก "ไขมัน" @ทำให้ง่ายต่อการดูว่าส่วนใดของข้อความเริ่มต้น / สิ้นสุด
DevSolar

@DevSolar ฉันพบว่า:%s#/home/martin/test#/home/jake/x#ทำงานได้ดียิ่งขึ้น แต่นั่นเป็นเพียงความเห็นส่วนตัว
Amit Gold
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.