Vim Regex แคปเจอร์กลุ่ม [bau -> byau: ceu -> cyeu]


132

ฉันมีรายการคำ:

bau
ceu
diu
fou
gau

ฉันต้องการเปลี่ยนรายการเป็น:

byau
cyeu
dyiu
fyou
gyau

ฉันลองคำสั่งไม่สำเร็จ:

:%s/(\w)(\w\w)/\1y\2/g

เนื่องจากสิ่งนี้ไม่ได้ผลฉันต้องเปลี่ยนอะไรเพื่อให้ regex capture group ทำงานใน Vim



4
มันนิด ๆ หน่อย ๆ ปิดหัวข้อดังนั้นฉันใส่มันนี่เป็นความคิดเห็น แต่ ... :%norm ay<CR>ฉันทำ
romainl

2
ในกรณีของคุณ (ถ้าตรงตามที่อธิบายไว้) เป็นตัวเลือกให้: ย้ายไปที่คอลัมน์ที่ 2 ด้วยl, เข้าสู่โหมด Visual Block ด้วยCtrl+v, ทำเครื่องหมายคอลัมน์ทั้งหมดShift+gตามด้วยl, จากนั้นเข้าสู่โหมดแทรกด้วยShift+iและป้อน 'y' การกดแป้น 7 ครั้งรวมถึงการสิ้นสุดEscเพื่อออกจากโหมดแทรก ไม่โพสต์เป็นคำตอบเพราะไม่ได้เกี่ยวกับกลุ่มการจับภาพ (ซึ่งเป็นสิ่งที่ฉันค้นหาเมื่อพบสิ่งนี้) :-)
LAFK พูดว่า Reinstate Monica

คำตอบ:


224

วิธีหนึ่งในการแก้ไขปัญหานี้คือการทำให้แน่ใจว่ารูปแบบถูกล้อมรอบด้วยวงเล็บที่ใช้Escape

:%s/\(\w\)\(\w\w\)/\1y\2/g

เล็กน้อยสั้น (และอื่น ๆมายากล -al) คือการใช้\vความหมายว่าในรูปแบบหลังจากที่มันอักขระ ASCII ทั้งหมดยกเว้น'0'-'9', 'a'-'z', 'A'-'Z'และ'_'มีความหมายพิเศษ:

:%s/\v(\w)(\w\w)/\1y\2/g

ดู:


41

หากคุณไม่ต้องการหลบหนีจากกลุ่มจับภาพด้วยแบ็กสแลช (นี่คือสิ่งที่คุณพลาด) \vให้เปลี่ยนเอนจิ้นนิพจน์ปกติของ Vim ให้เป็นโหมดเวทย์มนตร์มาก :

:%s/\v(\w)(\w\w)/\1y\2/g

อีกครั้งขอโทษสำหรับการวางคำถามในสถานที่ที่ไม่ถูกต้อง: งานนี้พบใน:exmode; มีวิธีการทำในกล่องโต้ตอบหา / แทนที่ gvim หรือไม่?
JJoao

3
@JJoao: ไม่กล่องค้นหา / แทนที่นั้นใช้สำหรับการค้นหาและแทนที่เท่านั้น คุณไม่ควรใช้สิ่งนั้น มันเป็นเพียงการฝึกล้อสำหรับผู้ใช้ Notepad
Ingo Karkat

ฉันขอขอบคุณ (ไม่ใช่สำหรับฉัน: ฉันมีความสุขกับ exmode แต่สำหรับนักภาษาศาสตร์ผู้ร่วมมือในโครงการพจนานุกรม): เกือบจะทำงานได้ - ด้วย\v...งาน regexp ค้นหา; ในสตริงการเปลี่ยนใช้&งานได้ แต่\ ได้รับการป้องกัน ( \1\rสูญหาย)
JJoao

@Joao: ใช่นั่นคือสิ่งที่ฉันพบในขณะที่เล่นกับมันเช่นกัน ฉันยังสงสัยว่าการใช้ Vim ไม่มีโหมด Ex เป็นความคิดที่ดีหรือไม่ แต่คุณสามารถสร้างกล่องโต้ตอบการค้นหาและแทนที่ของคุณเอง (ขับเคลื่อนโดยภายใน:s) ผ่านทางinputdialog()และ Vimscript เล็กน้อย
Ingo Karkat

Ingo: ขอบคุณอีกครั้ง ฉันเห็นด้วยกับความเห็นที่สงสัยของคุณ Inputdialg +: s + vimscript น่าจะเป็นวิธีที่การสร้างการค้นหาของ gvim ถูกสร้างขึ้น สำหรับฉัน\1 \r การรักษาเป็นข้อผิดพลาด gvim ฉันจะพยายามโพสต์ไว้ในรายการเฉพาะกลุ่ม ในขณะเดียวกันฉันจะลองหนึ่ง vimscript-inputdialog ของฉัน
JJoao

34

คุณยังสามารถใช้รูปแบบนี้ซึ่งสั้นกว่า:

:%s/^./&y
  • %s ใช้รูปแบบกับไฟล์ทั้งหมด
  • ^. ตรงกับอักขระตัวแรกของบรรทัด
  • &yเพิ่มyรูปแบบหลังจาก

13

คุณต้องหลบหนีจากการจัดกลุ่ม paranthesis:

:%s/\(\w\)\(\w\w\)/\1y\2/g

นั่นเป็นกลอุบาย

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