2008-09-11 10 views
9

Quiero encontrar cualquier texto en un archivo que coincide con una expresión regular de la forma t[A-Z]u (es decir, un partido t seguido de una letra mayúscula y otro partido u, y transformar el texto que coincide de manera que la letra mayúscula es minúscula. por ejemplo, para la expresión regular x[A-Z]yEmacs query-replace con la transformación textual

xAy 

convierte

xay 

y

xZy 

convierte

xzy 

función de Emacs query-replace permite copias de referencias, pero que yo sepa no la transformación del texto coincidente. ¿Hay una función incorporada que hace esto? ¿Alguien tiene una breve función de Elisp que podría usar?

ACTUALIZACIÓN

@Marcel Levy lo tiene: \, en una expresión de reemplazo introduce una expresión Elisp (arbitraria?). Por ejemplo, la solución a lo anterior es

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

Respuesta

13

Parece que Steve Yegge realidad ya publicado la respuesta a esta hace unos años: "Shiny and New: Emacs 22." vaya a "Cambio de la caja de cadenas de reemplazo" y podrá ver su código de ejemplo usando la función replace-regexp.

La respuesta general es que utiliza "\" para llamar a cualquier expresión de ceceo como parte de la cadena de reemplazo, como en \,(capitalize \1). Al leer el texto de ayuda, parece que solo está en modo interactivo, pero parece ser el único lugar donde sería más necesario.

1

Una alternativa a qrr en este caso es grabar una macro y reproducirla. (isearch-forward-regexp, selecciona el personaje, downcase-region.) Me resulta más fácil ejecutar macros sobre la marcha, ya que obtienes comentarios inmediatos si tu expresión regular es incorrecta.

0

Haría esto con una macro también, pero solo porque ejecutar código desde una cadena de reemplazo para una expresión regular es muy poco intuitivo para mí. Si está escribiendo un script por lotes o algo que necesita ir muy rápido, \, ciertamente es el camino a seguir.

Cuestiones relacionadas