2010-01-05 25 views
10

Supongamos que tengo lo siguiente en un archivo de texto (o búfer Dired) abierta en emacs: file_01.txt file_02.txt ... file_99.txtEmacs: cómo reemplazar una cadena utilizando una expresión regular?

quiero preguntar-reemplazar o sustituir los archivos a 01_file.txt, etc.

Quiero usar query-replace-regexp o replace-regexp, pero no sé qué poner. La parte de búsqueda puse en "file_ ..", pero el ".." se leen como puntos en la cadena de reemplazo. Estoy comenzando a aprender expresiones regulares y no sé cómo hacer esto. Por favor ayuda, gracias.

Respuesta

20

M-x replace-regexp invoca la función para reemplazar con expresiones regulares.

Para Reemplazar expresiones regulares escriba: \(file\)_\([0-9]+\)

Esto creará dos grupos, uno que coincida con el 'archivo' parte, y uno que coincida con el número. Los refuerzos \(... \) son necesarios para que la coincidencia esté disponible más adelante en la cadena de reemplazo.

Para Reemplazar con escriba: \2_\1

Esto inserta el segundo partido de la cadena de búsqueda (la parte numérica), añade el _ (subrayado) y después se añade el primer partido de la cadena de búsqueda (el " archivo').

Para obtener más información sobre las expresiones regulares de Emacs, vea Regexp Syntax y Regexp Replace.

Una vez que haya dominado los conceptos básicos de expresiones regulares, es posible que desee comprobar la herramienta Emacs ReBuilder con M-x re-builder, que le permite generar expresiones rectas de forma interactiva.

1

Estoy tratando de reproducir este ejemplo con fines de aprendizaje.

que tienen un tampón con file_01.txt file_02.txt file ...

Con re-builder la expresión \(file\)_\([0-9]+\) no funcionan, pero es necesario duplicar los escapes como \\(file\\)_\\([0-9]+\\).

En lo que respecta a la sustitución, probé lo que está escrito anteriormente, pero fue en vano.

Los siguientes comandos

M-x replace-regexp \(file\)_\([0-9]+\) o \\(file\\)_\\([0-9]+\\)

reemplazados con

\2_\1 o \\2_\\1

siempre resulta en Replaced 0 occurences. Es decir, no importa si el \ antes del paréntesis redondo es simple o duplicado.

Está claro que me falta algo obvio aquí. Podría explicar por favor ?

Estoy en GNU Emacs 24.3.1 (x86_64-pc-linux-gnu, GTK + versión 3.10.7)

+0

¿Alguna vez obtuvo una respuesta a este problema? Si incluso recuerdas en este punto, estaría interesado en la solución. – Daniel

+0

En cuanto a re-builder, vea http://emacs.stackexchange.com/q/5568/454 – phils

+0

En cuanto a "Sustituciones de 0 repeticiones", debe haber comenzado con el punto * después de * todo el texto que estaba tratando de reemplazar. Use 'M- <' para moverse al principio del búfer primero, y encontrará todo. – phils

Cuestiones relacionadas