Замініть дві струни між собою


9

Я хотів би змінити всі входження рядка (скажімо, string1) на інший рядок (скажімо, string2) і навпаки. Якщо бути точним, у мене довгий документ, і ці рядки трапляються багато разів. Що я зараз роблю, це замінити string1 -> string3, потім string2 -> string1 і нарешті string3 -> string2.

Мені цікаво, чи є вже функція в emacs, яка це робить. Інші рішення вітаються.

Редагувати : це фактично дублікат питання, пов’язаний у коментарі. Але проблема полягає в тому, що прийнята відповідь на це питання не завжди працює (див. Коментар нижче). Я думаю, що краще почекати, поки автор тієї прийнятої відповіді виправить свою відповідь чи якесь інше рішення. По-друге, перш ніж публікувати своє запитання, я погукнув це питання, і це питання не з’явилося. Я думаю, що два дублікати питання іноді корисні, оскільки вони використовують різні формулювання, і якщо користувач знайде дублікат, він / вона може знайти правильне.

Редагувати 2: Прийнята відповідь функції пошуку / заміни як для заміни тексту, здається, зараз добре.



@ T.Verron Я намагався використати прийняту відповідь вашого посилання, щоб замінити "This" на "that" у буфері подряпин, але це не працює.
Ім'я

Можливо, я прийняв занадто швидко. Коментуючи останні два аргументи ( backwardsта region-noncontiguous-p) у виклику perform-replaceзмушує це працювати тут (emacs 24.3). Я перевірю його на Emacs 25, коли отримаю привід, перш ніж редагувати іншу відповідь.
Т. Веррон

@ T.Verron, навпаки, інше рішення, що пропонує використовувати пакет plur. Здається, працює в цій ситуації без проблем.
Ім'я

Я змінив прийняту відповідь в іншому запитанні. Що стосується Google, так, у мене теж виникли проблеми з пошуком ключових слів, щоб передати те, що я намагався зробити. І так, дублікати - це добре! blog.stackoverflow.com/2010/11/…
Т. Веррон

Відповіді:


11

Для інтерактивного випадку запит-заміна-regexp (CM-%) може зробити це, використовуючи відносно невідоме \ для заміни.

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

Якщо текст заміни містить \, а за ним вираз lisp, він використовує значення цього виразу як заміну. У цьому випадку вираз є "якщо", яке приймає умову та повернене значення для справжнього та помилкового випадків.

У коментарях пропонується використовувати

\, (якщо \ 1 "string2" "string1")

Це працює, тому що \ 1 буде "string1", якщо шаблон відповідає string1, а в іншому випадку буде нульовим. Lisp приймає будь-яке ненульове значення як істинне. Хоча це працює і коротше, я вважаю, що моя відповідь корисніша. Я думаю, що код є більш читабельним для тих, чиї знання у програмі обмежені. Він має другу перевагу, оскільки він все ще працює, якщо шаблон "від" задано як

\(string1\|string2\)

або навіть

string1\|string2

2
Деякі коментарі до дубліката кандидата запропонували простіший синтаксис \,(if \1 "string2" "string1"), використовуючи регулярний вираз \(string1\)\|string2.
Т. Веррон

Дивіться останні два абзаци від (emacs) Regexp Replace.
Василь

-1

Ну, можливо, з макросом це буде просто:

F3C-saRETC-bM-tF4. Використовуючи цей макрос у своєму запитанні, кричить цей результат:

Я хотів би змінити всі випадки рядка a (скажімо string1) на інший рядок (скажімо, string2) і навпаки. Якщо бути точним, у мене є довгий документ, і ці рядки трапляються багато разів. Що я зараз роблю, це замінити string1 -> string3, потім string2 -> string1 і нарешті string3 -> string2.

Мені цікаво, чи є вже функція a в emacs, яка це робить. Інші рішення вітаються.

Я переміщую позиції між будь-яким словом після цього aі цим словом. Пізніше ви можете редагувати такий макрос, щоб також переміщувати інші слова, не потребуючи перевизначення всього макросу, за допомогою якого ви можете редагувати макрос C-xC-kRET.


1
Я не думаю, що питання пов'язане з перенесенням слів.
Т. Веррон

@ T.Verron Це так, але він хоче більш автоматизований підхід, здається.
шакра

1
Те, що робить ваш макрос, - це обмін (перенесення) кожного "а" з наступним словом. "string"> "string a" і т. д. Що він хоче зробити, це наприклад замінити кожен "a" на "the", а кожен "the" на "a".
Т. Веррон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.