แทนที่สองสายด้วยกัน


9

ฉันต้องการที่จะเปลี่ยนทุกสิ่งที่เกิดขึ้นของสตริง (พูด string1) กับสตริงอื่น (พูดว่า string2) และในทางกลับกัน เพื่อความแม่นยำฉันมีเอกสารยาวและสตริงเหล่านี้เกิดขึ้นหลายครั้ง สิ่งที่ฉันทำในปัจจุบันคือการแทนที่ string1 -> string3 จากนั้น string2 -> string1 และสุดท้าย string3 -> string2

ฉันสงสัยว่ามีฟังก์ชั่นเป็น emacs อยู่หรือไม่ ยินดีต้อนรับการแก้ปัญหาอื่น ๆ

แก้ไข : นี่เป็นคำถามซ้ำที่เชื่อมโยงในความคิดเห็น แต่ปัญหาคือคำตอบที่ได้รับการยอมรับของคำถามนั้นไม่ได้ผลเสมอไป (ดูความคิดเห็นด้านล่าง) ฉันคิดว่าเป็นการดีกว่าที่จะรอจนกว่าผู้เขียนคำตอบที่ยอมรับจะแก้ไขคำตอบของเขา / เธอหรือวิธีแก้ไขปัญหาอื่น ๆ ออกมา ประการที่สองก่อนโพสต์คำถามของฉันฉัน googled คำถามและคำถามนั้นไม่ปรากฏขึ้น ฉันคิดว่าการมีคำถามที่ซ้ำกันสองครั้งนั้นมีประโยชน์เนื่องจากพวกเขาใช้ถ้อยคำที่แตกต่างกันและหากผู้ใช้พบคำถามที่ซ้ำกันเขา / เธอสามารถค้นหาคำถามที่ถูกต้องได้

แก้ไข 2:คำตอบที่ยอมรับของคุณลักษณะ Search / replace-like สำหรับการสลับข้อความดูเหมือนจะไม่เป็นไร



@ T.Verron ฉันพยายามใช้คำตอบที่ได้รับการยอมรับของลิงก์ของคุณเพื่อแทนที่ "นี่" กับ "ที่" ในบัฟเฟอร์รอยขีดข่วน แต่มันไม่ทำงาน
ชื่อ

บางทีฉันอาจจะยอมรับเร็วเกินไป การแสดงความคิดเห็นอาร์กิวเมนต์สองตัวสุดท้ายที่ออก ( backwardsและregion-noncontiguous-p) ในการเรียกใช้perform-replaceทำให้ทำงานได้ที่นี่ (emacs 24.3) ฉันจะทดสอบใน emacs 25 เมื่อฉันได้รับโอกาสก่อนที่จะแก้ไขคำตอบอื่น ๆ
T. Verron

@ T.Verron ในทางกลับกันโซลูชันอื่น ๆ ที่แนะนำให้ใช้ Plur แพ็กเกจ ดูเหมือนว่าจะทำงานในสถานการณ์นี้ได้โดยไม่มีปัญหา
ชื่อ

ฉันเปลี่ยนคำตอบที่ยอมรับในคำถามอื่น เกี่ยวกับ google ใช่ฉันมีปัญหาในการค้นหาคำหลักเพื่อสื่อสิ่งที่ฉันพยายามทำ และใช่ซ้ำกันดี! blog.stackoverflow.com/2010/11/…
T. Verron

คำตอบ:


11

สำหรับ case-replace-regexp (CM-%) case case แบบโต้ตอบสามารถทำได้โดยใช้ \ ที่ไม่รู้จัก \ สำหรับการแทนที่

C-M-% \(string1\)\|\(string2\)
\,(if (equal \& "string1") "string2" "string1")

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

ในความคิดเห็นจะแนะนำให้ใช้

\, (ถ้า \ 1 "string2" "string1")

สิ่งนี้ทำงานได้เพราะ \ 1 จะเป็น "string1" หากรูปแบบตรงกับ string1 และจะไม่มีเป็นอย่างอื่น เสียงกระเพื่อมใช้ค่าที่ไม่เป็นศูนย์ใด ๆ เป็นจริง ในขณะที่ใช้งานได้และสั้นกว่านี้ฉันคิดว่าคำตอบของฉันมีประโยชน์มากกว่า ฉันคิดว่ารหัสนี้สามารถอ่านได้กับบางคนที่มีความรู้ไม่ชัด จำกัด มันมีข้อได้เปรียบที่สองเนื่องจากยังใช้งานได้หากได้รับรูปแบบ "จาก"

\(string1\|string2\)

หรือแม้กระทั่ง

string1\|string2

2
บางความคิดเห็นในผู้สมัครซ้ำปัญหาไวยากรณ์ง่าย\,(if \1 "string2" "string1")โดยใช้ \(string1\)\|string2regexp
T. Verron

(emacs) Regexp Replaceดูสองย่อหน้าสุดท้ายของ
เพรา

-1

บางทีด้วยมาโครอาจเป็นเรื่องง่าย:

F3C-saRETC-bM-tF4. การใช้มาโครนี้กับคำถามของคุณตะโกนผลลัพธ์นี้:

ฉันต้องการเปลี่ยนสตริง a (say string1) ทั้งหมดเป็น string อื่น (say string2) และในทางกลับกัน จะแม่นยำฉันมีเอกสารยาวและสตริงเหล่านี้เกิดขึ้นหลายครั้ง สิ่งที่ฉันทำในปัจจุบันคือการแทนที่ string1 -> string3 จากนั้น string2 -> string1 และสุดท้าย string3 -> string2

ฉันสงสัยว่าถ้ามีฟังก์ชัน a อยู่ใน emacs อยู่หรือไม่ ยินดีต้อนรับการแก้ปัญหาอื่น ๆ

ฉันกำลังย้ายตำแหน่งระหว่างคำใดก็ตามที่อยู่หลังคำaและคำนั้น คุณสามารถแก้ไขแมโครดังกล่าวเพื่อแปลงคำอื่น ๆ ในภายหลังได้โดยไม่จำเป็นต้องกำหนดแมโครใหม่ทั้งหมดคุณสามารถแก้ไขแมโครC-xC-kRETได้


1
ฉันไม่คิดว่าคำถามเกี่ยวข้องกับการแปลงคำ
T. Verron

@ T.Verron มันเป็น แต่เขาต้องการวิธีการอัตโนมัติมากขึ้นดูเหมือนว่า
shackra

1
สิ่งที่แมโครของคุณทำคือแลกเปลี่ยน (transposing) แต่ละคำว่า "a" ด้วยคำถัดไป "a string"> "a string" ฯลฯ สิ่งที่เขาต้องการทำคือแทนที่ "a" ด้วย "the" และ "a" ด้วย "a" แต่ละรายการ
T. Verron
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.