2008-09-11 4 views
9

Ich möchte einen beliebigen Text in einer Datei zu finden, die einen regulären Ausdruck des Formulars übereinstimmt t[A-Z]u (dh ein Spiel t von einem Großbuchstaben und ein anderes Spiel folgte u und verwandeln den gefundenen Text, so dass der Großbuchstaben Klein ist z. B. für die regexp x[A-Z]yEmacs abfrage ersetzen mit Text Transformation

xAy 

wird

xay 

und

xZy 

wird

xzy 

Emacs' query-replace Funktion erlaubt Rückbeziehung, aber AFAIK nicht die Umwandlung des Matched Text. Gibt es dafür eine eingebaute Funktion? Hat jemand eine kurze Elisp-Funktion, die ich benutzen könnte?

UPDATE

@Marcel Levy hat: \, in einer Ersatz-Expression führt einen (beliebigen?) Elisp Ausdruck. Zum Beispiel ist die Lösung für die oben

M-x replace-regexp <RET> x\([A-Z]\)z <RET> x\,(downcase \1)z 

Antwort

13

Es sieht aus wie Steve Yegge eigentlich schon die Antwort auf diese ein paar Jahre zurück geschrieben: "Shiny and New: Emacs 22." Scroll down „Ändern Fall in Ersatz Strings“ und Sie werden seinen Beispielcode sehen Verwenden der replace-regexp Funktion.

Die allgemeine Antwort lautet, dass Sie "\" verwenden, um einen beliebigen Lisp-Ausdruck als Teil der Ersetzungszeichenfolge wie in \,(capitalize \1) aufzurufen. Wenn man den Hilfetext liest, sieht es so aus, als wäre es nur im interaktiven Modus, aber das scheint der einzige Ort zu sein, an dem dies am nötigsten ist.

1

Eine Alternative zu qrr ist in diesem Fall das Aufnehmen eines Makros und das erneute Abspielen. (isearch-forward-regexp, wähle den Charakter, downcase-Bereich.) Ich finde on-the-fly Makros einfacher, da du sofort Feedback bekommst, wenn deine Regexp falsch ist.

0

Ich würde dies auch mit einem Makro tun, aber nur, weil die Ausführung von Code aus einer Ersatzzeichenfolge für einen regulären Ausdruck für mich nicht intuitiv ist. Wenn Sie ein Batch-Skript schreiben oder etwas, das sehr schnell gehen muss, \, ist sicherlich der Weg zu gehen.

Verwandte Themen