2009-06-29 17 views
8

Ich versuche, eine search and replace with regexs zu tun.Regex Ersatz mit Emacs

Angenommen, ich habe eine foreach(foo1.txt, foo2.txt, foo3.txt, foo4.txt). Und ich will "in der Liste um jedes Element setzen

ich aus der Dokumentation dachte- -., Dass dieser regex (foo[1-4]\.txt) -> "\&" funktionieren würde

Aber es nicht, was mache ich falsch

..?

Antwort

8

Beachten Sie, dass Klammern und Klammern müssen entkommen ("extra Schrägstriche") in einem Suche regexp, aber nicht in der ersetzen regexp.

Die Escapes sind erforderlich, weil der Lisp-Parser die Regex vor der Regex-Engine sieht.

Wenn Sie jedoch programmgesteuert schreiben (im Gegensatz zu einem interaktiven Eintrag), müssen Sie den Escape-Zeichen entkommen! ay-yi-yi ....

interactive: 
M-x replace-regexp RET \(obj.method(.*)\{1\}\) RET trim$(\1) 

programmatic: 
(replace-regexp "\\(obj.method(.*)\\{1\\}\\)" "trim$(\\1)") 

die entkam Pars entkommen, weil sie die unescaped Pars sind gruppieren, wörtliche Pars.

Sie möchten vielleicht die Emacs Wiki Regex Crash Course und Steve Yegge's Effective Emacs regex section überprüfen.

+2

Hilfreich, aber ein wenig gruselig. "Entfliehen Sie den Fluchten". Meep. –

2

Probieren sie etwas wie dieses \(foo[1-4]\.txt\)

2

Emacs regexps mich immer ertappen, cos sie nicht Perl sind:

\(foo[1-4]\.txt\) 

Sie müssen die Klammern in Emacs mit einem umgekehrten Schrägstrich versehen.

1

Sie haben bereits die richtige Antwort über die Regexp, aber in diesem Fall wäre es wahrscheinlich einfacher, stattdessen Makros zu verwenden. Setzen Sie den Punkt am Anfang des Vornamens und Typ:

C-x (" M-f M-f " C-f C-f C-x) 

Das heißt, starten Makro aufnehmen, legen Zitat, gehen zwei Worte nach vorne, legen Zitat, gehen zwei Zeichen nach vorn für das nächste Element, und die Aufnahme stoppen Makro.

Dann führen Sie das Makro mit C-x e. Um zu wiederholen, drücken Sie einfach erneut e.

(In Emacs 23, können Sie F3 anstelle von 'C-x (' und F4 statt sowohl 'C-x)' und 'C-x e' verwenden.)