Thay thế hai chuỗi với nhau


9

Tôi muốn thay đổi tất cả các lần xuất hiện của một chuỗi (giả sử chuỗi1) bằng một chuỗi khác (giả sử chuỗi2) và ngược lại. Nói chính xác tôi có một tài liệu dài và các chuỗi này xảy ra nhiều lần. Những gì tôi hiện đang làm, là thay thế chuỗi1 -> chuỗi3, sau đó chuỗi2 -> chuỗi1 và cuối cùng là chuỗi3 -> chuỗi2.

Tôi tự hỏi nếu đã có một chức năng trong emacs mà làm điều này. Các giải pháp khác được hoan nghênh.

Chỉnh sửa : Đây thực sự là một bản sao của câu hỏi được liên kết trong bình luận. Nhưng vấn đề là câu trả lời được chấp nhận của câu hỏi đó không phải lúc nào cũng hoạt động (xem bình luận bên dưới). Tôi nghĩ tốt hơn là đợi cho đến khi tác giả của câu trả lời được chấp nhận đó sửa câu trả lời của anh ấy / cô ấy hoặc một số giải pháp khác được đưa ra. Thứ hai trước khi đăng câu hỏi của tôi, tôi đã goog câu hỏi và câu hỏi đó đã không xuất hiện. Tôi nghĩ rằng có hai câu hỏi trùng lặp đôi khi hữu ích vì chúng sử dụng từ ngữ khác nhau và nếu người dùng tìm thấy câu hỏi trùng lặp, anh ấy / cô ấy có thể tìm thấy câu hỏi đúng.

Chỉnh sửa 2: Câu trả lời được chấp nhận của tính năng Tìm kiếm / thay thế cho việc hoán đổi văn bản dường như vẫn ổn.



@ T.Verron Tôi đã cố gắng sử dụng câu trả lời được chấp nhận của liên kết của bạn để thay thế "Cái này" bằng "cái đó" trong bộ đệm đầu nhưng nó không hoạt động.
Tên

Có lẽ tôi đã chấp nhận quá nhanh. Nhận xét hai đối số cuối cùng ( backwardsregion-noncontiguous-p) trong lời kêu gọi perform-replacelàm cho nó hoạt động ở đây (emacs 24.3). Tôi sẽ kiểm tra nó trên emacs 25 khi tôi có dịp trước khi chỉnh sửa câu trả lời khác.
T. Verron

@ T.Verron thì ngược lại, giải pháp khác đề nghị sử dụng gói plur. Nó dường như làm việc trong tình huống này mà không có vấn đề.
Tên

Tôi đã thay đổi câu trả lời được chấp nhận trong câu hỏi khác. Về google, vâng, tôi cũng gặp khó khăn khi tìm từ khóa để truyền đạt những gì tôi đang cố gắng làm. Và vâng, trùng lặp là tốt! blog.stackoverflow.com/2010/11/ Lời
T. Verron

Câu trả lời:


11

Đối với trường hợp tương tác truy vấn-thay thế-regrec (CM-%) có thể thực hiện việc này, bằng cách sử dụng \ tương đối không xác định, để thay thế.

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

Nếu văn bản thay thế chứa \, theo sau là một biểu thức lisp, nó sử dụng giá trị của biểu thức đó làm thay thế. Trong trường hợp này, biểu thức là "nếu" có một điều kiện và giá trị trả về cho các trường hợp đúng và sai.

Trong các ý kiến, nó được đề xuất để sử dụng

\, (nếu \ 1 "chuỗi2" "chuỗi1")

Điều này hoạt động vì \ 1 sẽ là "chuỗi1" nếu mẫu khớp với chuỗi1 và sẽ không bằng không. Lisp nhận bất kỳ giá trị không nào là đúng. Trong khi điều này hoạt động và ngắn hơn, tôi nghĩ câu trả lời của tôi hữu ích hơn. Tôi nghĩ rằng mã dễ đọc hơn đối với người có kiến ​​thức không tốt. Nó có lợi thế thứ hai vì nó vẫn hoạt động nếu mẫu "từ" được đưa ra là

\(string1\|string2\)

hoặc thậm chí

string1\|string2

2
Một số nhận xét trong ứng cử viên trùng lặp đề xuất cú pháp đơn giản hơn \,(if \1 "string2" "string1"), sử dụng biểu thức chính \(string1\)\|string2.
T. Verron

Xem hai đoạn cuối của (emacs) Regexp Replace.
Basil

-1

Chà, có lẽ với một macro điều này sẽ dễ dàng:

F3C-saRETC-bM-tF4. Sử dụng macro này cho câu hỏi của bạn sẽ cho kết quả này:

Tôi muốn thay đổi tất cả các lần xuất hiện của chuỗi a (nói chuỗi1) bằng một chuỗi khác (giả sử chuỗi2) và ngược lại. Nói chính xác là tôi có một tài liệu dài và các chuỗi này xảy ra nhiều lần. Những gì tôi hiện đang làm, là thay thế chuỗi1 -> chuỗi3, sau đó chuỗi2 -> chuỗi1 và cuối cùng là chuỗi3 -> chuỗi2.

Tôi tự hỏi nếu đã có chức năng a trong emacs mà làm điều này. Các giải pháp khác được hoan nghênh.

Tôi đang chuyển vị trí giữa bất kỳ từ nào sau một atừ đó. Sau này bạn cũng có thể chỉnh sửa macro như vậy để hoán chuyển các từ khác mà không cần xác định lại toàn bộ macro, bạn có thể chỉnh sửa macro với C-xC-kRET.


1
Tôi không nghĩ câu hỏi có liên quan đến chuyển từ.
T. Verron

@ T.Verron Đó là, nhưng anh ấy muốn một cách tiếp cận tự động hóa hơn, dường như.
shackra

1
Những gì macro của bạn làm là trao đổi (hoán vị) mỗi "a" với từ tiếp theo. "một chuỗi"> "chuỗi a", v.v. Những gì anh ấy muốn làm là ví dụ thay thế "a" bằng "the" và mỗi "the" bằng "a".
T. Verron
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.