Ersetzen Sie zwei Saiten miteinander

9

Ich möchte alle Vorkommen einer Zeichenfolge (z. B. Zeichenfolge1) durch eine andere Zeichenfolge (z. B. Zeichenfolge2) ändern und umgekehrt. Um genau zu sein, habe ich ein langes Dokument und diese Zeichenfolgen kommen oft vor. Was ich derzeit mache, ist, string1 -> string3, dann string2 -> string1 und schließlich string3 -> string2 zu ersetzen.

Ich frage mich, ob es in emacs bereits eine Funktion gibt, die dies tut. Andere Lösungen sind willkommen.

Bearbeiten : Dies ist tatsächlich ein Duplikat der im Kommentar verknüpften Frage. Das Problem ist jedoch, dass die akzeptierte Antwort auf diese Frage nicht immer funktioniert (siehe Kommentar unten). Ich denke, es ist besser zu warten, bis der Autor dieser akzeptierten Antwort seine / ihre Antwort korrigiert oder eine andere Lösung herauskommt. Zweitens habe ich vor dem Posten meiner Frage die Frage gegoogelt und diese Frage wurde nicht angezeigt. Ich denke, zwei doppelte Fragen zu haben ist manchmal nützlich, da sie unterschiedliche Formulierungen verwenden und wenn ein Benutzer die doppelte findet, kann er die richtige finden.

Bearbeiten 2: Die akzeptierte Antwort der Such- / Ersetzungsfunktion zum Austauschen von Text scheint jetzt in Ordnung zu sein.

Name
quelle
4
Mögliches Duplikat der Such- / Ersetzungsfunktion zum Austauschen von Text
T. Verron
@ T.Verron Ich habe versucht, die akzeptierte Antwort Ihres Links zu verwenden, um "This" durch "that" im Scratch Buffer zu ersetzen, aber es funktioniert nicht.
Name
Vielleicht habe ich zu schnell akzeptiert. Wenn Sie die letzten beiden Argumente ( backwardsund region-noncontiguous-p) im Aufruf von perform-replaceauskommentieren, funktioniert dies hier (emacs 24.3). Ich werde es auf Emacs 25 testen, wenn ich eine Gelegenheit bekomme, bevor ich die andere Antwort bearbeite.
T. Verron
@ T.Verron dagegen schlägt die andere Lösung vor, die Packung plur zu verwenden. Es scheint in dieser Situation ohne Probleme zu funktionieren.
Name
Ich habe die akzeptierte Antwort in der anderen Frage geändert. In Bezug auf Google hatte ich auch Probleme, Schlüsselwörter zu finden, um zu vermitteln, was ich versuchte. Und ja, Duplikate sind gut! blog.stackoverflow.com/2010/11/…
T. Verron

Antworten:

11

Für den interaktiven Fall kann query-replace-regexp (CM-%) dies unter Verwendung des relativ unbekannten \ für das Ersetzen tun.

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

Wenn der Ersatztext \ enthält, gefolgt von einem lisp-Ausdruck, wird der Wert dieses Ausdrucks als Ersatz verwendet. In diesem Fall ist der Ausdruck ein "if", das eine Bedingung und den Rückgabewert für die wahren und falschen Fälle annimmt.

In den Kommentaren wird empfohlen, zu verwenden

\, (wenn \ 1 "string2" "string1")

Dies funktioniert, weil \ 1 "string1" ist, wenn das Muster mit string1 übereinstimmt, und ansonsten null ist. Lisp nimmt jeden Nicht-Null-Wert als wahr an. Während dies funktioniert und kürzer ist, denke ich, dass meine Antwort nützlicher ist. Ich denke, der Code ist für jemanden besser lesbar, dessen Lisp-Wissen begrenzt ist. Es hat einen zweiten Vorteil, da es immer noch funktioniert, wenn das "von" -Muster als angegeben wird

\(string1\|string2\)

oder auch

string1\|string2
icarus
quelle
2
Einige Kommentare im doppelten Kandidaten schlugen die einfachere Syntax \,(if \1 "string2" "string1")unter Verwendung des regulären Ausdrucks vor \(string1\)\|string2.
T. Verron
Siehe die letzten beiden Absätze von (emacs) Regexp Replace.
Basil
-1

Nun, vielleicht wäre das mit einem Makro einfach:

F3C-saRETC-bM-tF4. Wenn Sie dieses Makro für Ihre Frage verwenden, wird das folgende Ergebnis angezeigt:

Ich möchte alle Vorkommen von Zeichenfolge a (z. B. Zeichenfolge1) durch eine andere Zeichenfolge (z. B. Zeichenfolge2) ändern und umgekehrt. Um genau zu sein, ich habe ein langes Dokument und diese Zeichenfolgen kommen oft vor. Was ich derzeit mache, ist, string1 -> string3, dann string2 -> string1 und schließlich string3 -> string2 zu ersetzen.

Ich frage mich, ob es in emacs bereits eine Funktion gibt, die dies tut. Andere Lösungen sind willkommen.

Ich transponiere Positionen zwischen jedem Wort nach einem aund diesem Wort. Sie können ein solches Makro später bearbeiten, um auch andere Wörter zu transponieren, ohne das gesamte Makro neu definieren zu müssen. Sie können das Makro mit bearbeiten C-xC-kRET.

Shackra
quelle
1
Ich glaube nicht, dass die Frage mit der Umsetzung von Wörtern zusammenhängt.
T. Verron
@ T.Verron Es ist, aber er will einen automatisierten Ansatz, wie es scheint.
Shackra
1
Was Ihr Makro tut, ist, jedes "a" mit dem nächsten Wort auszutauschen (zu transponieren). "a string"> "string a" usw. Was er tun möchte, ist z. B. jedes "a" durch "the" und jedes "the" durch "a" zu ersetzen.
T. Verron