แทนที่ด้วย VIM นำส่วนการค้นหารูปแบบกลับมาใช้ใหม่


29

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

ตัวอย่างง่ายๆจะเป็นบรรทัดที่ฉันต้องการที่จะเปลี่ยน(10)ไป{10}ที่ 10 สามารถเป็นตัวเลขใด ๆ

ฉันมาไกลขนาดนี้

  .s/([0-9]*)/what here??/

ซึ่งตรงกับส่วนที่ฉันต้องการ

ตอนนี้ฉันพยายามแทน

  .s/([0-9]*)/{\0}/

แต่นี่ให้เป็นผลลัพธ์ {(10)}

จากนั้นฉันก็ลอง

 .s/(\zs[0-9]*\ze)/{\0}/

อย่างไรก็ตามนั่นทำให้ฉัน({10})ซึ่งฉันก็ปิด แต่ไม่ใช่สิ่งที่ฉันต้องการ

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

คำตอบ:


37

\0เป็นการแข่งขันทั้งหมด หากต้องการใช้เพียงบางส่วนคุณจะต้องตั้งค่าเช่นนี้และใช้ \ 1

.s/(\([0-9]*\))/{\1}/

คำแนะนำโดยละเอียดเพิ่มเติมคุณสามารถค้นหาได้ที่นี่หรือในวิธีใช้กลุ่ม


โปรดทราบว่าวงเล็บสำหรับการดักจับมีเครื่องหมายแบ็กสแลช
Randall

0

ฉันเพิ่งรับรหัสมรดกบางส่วนและฉันต้องการแทนที่เหตุการณ์ที่เกิดขึ้นเช่น:

print "xx"
print x,y
print 'xx'

ไปยัง

logging.info("xy") 

หรือ

logging.info(x,y)

การสร้างคำตอบก่อนหน้านี้และหวังว่าใครบางคนจะได้ประโยชน์จากมันฉันใช้คำสั่งต่อไปนี้ซึ่งจะเปลี่ยนเหตุการณ์ทั้งหมด:

%s/print\( .*\)/logging.info\(\1\)/g

หากคุณแทนที่%ด้วย.และลบ/gคุณจะจบลงด้วย

.s/print\( .*\)/logging.info\(\1\)

ที่จะช่วยให้คุณสามารถผ่านแต่ละการแข่งขันและเลือกว่าคุณจะเปลี่ยนแปลงหรือไม่


0

วิธีที่ดีกว่าในการช่วยให้คุณสามารถเอาชนะแต่ละการแข่งขันได้คือการเพิ่ม "c" ต่อท้ายโค้ดแทนที่จะไปทีละบรรทัด

%s/print\( .*\)/logging.info\(\1\)/gc

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