Reemplazar dos cuerdas entre sí

9

Me gustaría cambiar todas las apariciones de una cadena (digamos string1) con otra cadena (digamos string2) y viceversa. Para ser precisos, tengo un documento largo y estas cadenas ocurren muchas veces. Lo que hago actualmente es reemplazar string1 -> string3, luego string2 -> string1 y finalmente string3 -> string2.

Me pregunto si ya hay una función en emacs que haga esto. Otras soluciones son bienvenidas.

Editar : esto es en realidad un duplicado de la pregunta vinculada en el comentario. Pero el problema es que la respuesta aceptada de esa pregunta no siempre funciona (vea el comentario a continuación). Creo que es mejor esperar hasta que el autor de esa respuesta aceptada corrija su respuesta o salga alguna otra solución. En segundo lugar, antes de publicar mi pregunta, busqué en Google la pregunta y esa pregunta no apareció. Creo que a veces es útil tener dos preguntas duplicadas, ya que usan una redacción diferente y si un usuario encuentra la duplicada, puede encontrar la correcta.

Edición 2: la respuesta aceptada de la función Buscar / reemplazar como para intercambiar texto parece estar bien ahora.

Nombre
fuente
44
Posible duplicado de la función Buscar / reemplazar como para intercambiar texto
T. Verron
@ T.Verron Traté de usar la respuesta aceptada de su enlace para reemplazar "This" con "that" en el búfer de memoria virtual, pero no funciona.
Nombre
Quizás acepté demasiado rápido. Comentando los dos últimos argumentos ( backwardsy region-noncontiguous-p) en la llamada de perform-replacehace que funcione aquí (emacs 24.3). Lo probaré en emacs 25 cuando tenga una ocasión antes de editar la otra respuesta.
T. Verron
@ T.Verron, por el contrario, la otra solución sugiere utilizar el paquete plur. Parece funcionar en esta situación sin problema.
Nombre
He cambiado la respuesta aceptada en la otra pregunta. Con respecto a Google, sí, también tuve problemas para encontrar palabras clave para transmitir lo que estaba tratando de hacer. Y sí, ¡los duplicados son buenos! blog.stackoverflow.com/2010/11/…
T. Verron

Respuestas:

11

Para el caso interactivo query-replace-regexp (CM-%) puede hacer esto, utilizando el relativamente desconocido \, para el reemplazo.

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

Si el texto de reemplazo contiene \, seguido de una expresión lisp, usa el valor de esa expresión como reemplazo. En este caso, la expresión es un "if" que toma una condición y el valor de retorno para los casos verdadero y falso.

En los comentarios se sugiere usar

\, (si \ 1 "cadena2" "cadena1")

Esto funciona porque \ 1 será "string1" si el patrón coincide con string1, y de lo contrario será nulo. Lisp toma cualquier valor no nulo como verdadero. Si bien esto funciona y es más corto, creo que mi respuesta es más útil. Creo que el código es más legible para alguien cuyo conocimiento es limitado. Tiene una segunda ventaja, ya que todavía funciona si el patrón "de" se da como

\(string1\|string2\)

o incluso

string1\|string2
Ícaro
fuente
2
Algunos comentarios en el candidato duplicado sugirieron la sintaxis más simple \,(if \1 "string2" "string1"), usando la expresión regular \(string1\)\|string2.
T. Verron
Ver los dos últimos párrafos de (emacs) Regexp Replace.
Albahaca
-1

Bueno, tal vez con una macro esto sería fácil:

F3C-saRETC-bM-tF4. El uso de esta macro en su pregunta grita este resultado:

Me gustaría cambiar todas las apariciones de la cadena a (por ejemplo, cadena1) con otra cadena (por ejemplo, cadena2) y viceversa. Para ser precisos, tengo un documento largo y estas cadenas ocurren muchas veces. Lo que hago actualmente es reemplazar string1 -> string3, luego string2 -> string1 y finalmente string3 -> string2.

Me pregunto si ya hay una función en emacs que hace esto. Otras soluciones son bienvenidas.

Estoy transponiendo posiciones entre cualquier palabra después de una ay esa palabra. Más tarde, puede editar dicha macro para transponer otras palabras sin necesidad de redefinir la macro completa, puede editar la macro con C-xC-kRET.

Shackra
fuente
1
No creo que la pregunta esté relacionada con la transposición de palabras.
T. Verron
@ T.Verron Lo es, pero parece que quiere un enfoque más automatizado.
shackra
1
Lo que hace su macro es intercambiar (transponer) cada "a" con la siguiente palabra. "a string"> "string a" etc. Lo que quiere hacer es, por ejemplo, reemplazar cada "a" con "the" y cada "the" con "a".
T. Verron