¿Cómo busco y reemplazo un conjunto de archivos?

9

Me gustaría definir un conjunto de archivos dentro del cual pueda buscar y reemplazar texto.

Para aclarar:

Me gustaría poder buscar, por ejemplo, en todos los archivos xk * .tex en un directorio dado (y excluyendo los archivos de respaldo). También me gustaría poder cambiar la expresión, por ejemplo, "incertidumbre", a "indeterminación" en todos los archivos dd * .sh y ee * .cls.

¿Cuál es la forma estándar de hacer esto?

Claudio
fuente
@Claudio Es posible que desee echar un vistazo diredpara buscar y reemplazar en un subconjunto de archivos en un directorio determinado.
Calamardo
Aquí hay un ejemplo de hacer "buscar / reemplazar" en múltiples archivos en un directorio / proyecto usando ag, wgrepy multiple-cursors.
Kaushal Modi

Respuestas:

4

Si está trabajando en un proyecto bien definido, puede utilizar occure grepinstalaciones dentro de ese proyecto a través projectile. A partir de su descripción de Github, entre los diversos bits de funcionalidad que ofrece projectile, puede hacer:

  • reemplazar en proyecto
  • multi-ocurrencia en buffers de proyecto
  • grep en proyecto
  • visitar proyecto en dired
Dan
fuente
4

Si todos los archivos están en el mismo directorio, puede seguir estos pasos. Basaré esto en el segundo ejemplo dado en los comentarios:

  1. M-xdiredpara abrir el directorio relevante en diredmodo.
  2. %mpara ejecutar dired-mark-files-regexpen ese directorio.
  3. Enter ^dd.*\.sh$, que es la expresión regular equivalente a dd*.sh. Esos archivos ahora estarán marcados con un *, y también pueden aparecer resaltados en un color diferente dependiendo de su esquema de color.
  4. Repita el paso 3 tantas veces como sea necesario, con la expresión regular que desee (por ejemplo ^ee.*\.cls$) hasta que se marquen todos los archivos que desea editar.
  5. Qpara ejecutar dired-do-query-replace-regexpen los archivos que marcó.
  6. Introduzca uncertaintyy indeterminacycomo las cadenas de consulta. (Creo que esto distingue entre mayúsculas y minúsculas. Si necesita que no distinga entre mayúsculas y minúsculas, puede requerir una expresión regular, pero no estoy seguro).

Y esa es la idea. Si necesita repetir esto varias veces en diferentes carpetas, puede grabar los pasos 2 a 6 como una macro (presione C-x (después del paso 1 y C-x )después del paso 6). E incluso si no te sientes muy cómodo con elisp, puedes traducir esa macro en elisp usando insert-kbd-macroe intentar hackearla en una función útil.

Brian Z
fuente
1
Tenga en cuenta que en Emacsland, S-qno significa shift+q, significa super+q. Deberías escribir Qsi quieres decir shift+q. Edité tu comentario para reflejar esto.
niñera
2
En realidad no, S-qsignifica shift+q; super+qSería escrito s-q.
Sue D. Nymme
3

Puede usar M-x find-name-diredpara obtener un búfer dired que contenga enlaces a todos los archivos que coincidan con un patrón de nombre dado.

Utilícelo M-x find-grep-diredpara obtener un búfer directo que contenga aquellos archivos cuyo contenido coincida con el patrón grep proporcionado.

Hay muchos más comandos de este tipo; lo que sea más apropiado depende de sus requisitos, así que considere actualizar su pregunta.

Luego puede recorrer la lista de archivos usando macros. Eche un vistazo a la respuesta de Brian para ver un ejemplo: https://emacs.stackexchange.com/a/9497/2005

rekado
fuente
1

Usa rgrep y wgrep.

Con rgrep puede buscar una expresión regular en archivos cuyo nombre de archivo coincida con una expresión regular y dentro de un directorio (y sus subdirecciones)

con wgrep puede editar el búfer que contiene los resultados de su búsqueda rgrep.

PuercoPop
fuente