Comment rechercher et remplacer un ensemble de fichiers?

9

Je voudrais définir un ensemble de fichiers dans lesquels je peux rechercher et remplacer du texte.

Clarifier:

Je voudrais pouvoir rechercher, par exemple, dans tous les fichiers xk * .tex dans un répertoire donné (et à l'exclusion des fichiers de sauvegarde). Je voudrais également pouvoir changer l'expression, par exemple, "incertitude", en "indétermination" dans tous les fichiers dd * .sh et ee * .cls.

Quelle est la manière standard de procéder?

Claudio
la source
@Claudio Vous voudrez peut-être jeter un œil à diredla recherche et au remplacement sur un sous-ensemble de fichiers dans un répertoire donné.
Squidly
Voici un exemple de "recherche / remplacement" dans plusieurs fichiers d'un répertoire / projet en utilisant ag, wgrepet multiple-cursors.
Kaushal Modi du

Réponses:

4

Si vous travaillez sur un projet bien défini, vous pouvez utiliser occuret utiliser les grepinstallations de ce projet via projectile. À partir de sa description github, parmi les différents éléments de fonctionnalité offerts par projectile, il peut faire:

  • remplacer dans le projet
  • multi-occurrence dans les tampons de projet
  • grep dans le projet
  • visiter le projet en dired
Dan
la source
4

Si tous les fichiers se trouvent dans le même répertoire, vous pouvez suivre ces étapes. Je baserai cela sur le deuxième exemple donné dans les commentaires:

  1. M-xdiredpour ouvrir le répertoire correspondant en diredmode.
  2. %mà exécuter dired-mark-files-regexpdans ce répertoire.
  3. Entrez ^dd.*\.sh$, qui est l' expression rationnelle équivalente à dd*.sh. Ces fichiers seront désormais marqués d'un *, et peuvent également apparaître en surbrillance dans une couleur différente en fonction de votre jeu de couleurs.
  4. Répétez l'étape 3 autant de fois que nécessaire, avec toute expression rationnelle que vous souhaitez (par exemple ^ee.*\.cls$) jusqu'à ce que tous les fichiers que vous souhaitez modifier soient marqués.
  5. Qpour exécuter dired-do-query-replace-regexples fichiers que vous avez marqués.
  6. Entrez uncertaintyet indeterminacycomme chaînes de requête. (Je pense que ce sera sensible à la casse. Si vous avez besoin qu'il soit insensible à la casse, cela peut nécessiter une expression rationnelle, mais je ne suis pas sûr.)

Et c'est l'idée. Si vous devez répéter cette opération plusieurs fois dans différents dossiers, vous pouvez enregistrer les étapes 2 à 6 sous forme de macro (appuyez sur C-x (après l'étape 1 et C-x )après l'étape 6). Et même si vous n'êtes pas très à l'aise avec elisp, vous pouvez traduire cette macro en elisp en utilisant insert-kbd-macroet essayer de la pirater en une fonction utile.

Brian Z
la source
1
Veuillez noter que dans Emacsland, S-qcela ne signifie pas shift+q, cela signifie super+q. Vous devriez juste écrire Qsi vous voulez dire shift+q. J'ai modifié votre commentaire pour refléter cela.
nounou
2
En fait non, S-qcela signifie shift+q; super+qserait écrit s-q.
Sue D. Nymme
3

Vous pouvez utiliser M-x find-name-diredpour obtenir un tampon dired contenant des liens vers tous les fichiers correspondant à un modèle de nom donné.

Utilisez M-x find-grep-diredpour obtenir un tampon dired contenant les fichiers dont le contenu correspond au modèle grep fourni.

Il existe de nombreuses autres commandes de ce type; ce qui est le plus approprié dépend de vos besoins, alors pensez à mettre à jour votre question.

Ensuite, vous pouvez parcourir la liste des fichiers à l'aide de macros. Jetez un œil à la réponse de Brian pour un exemple: https://emacs.stackexchange.com/a/9497/2005

rekado
la source
1

Utilisez rgrep et wgrep.

Avec rgrep, vous pouvez rechercher tout un regexp dans des fichiers dont le nom de fichier correspond à un regexp et dans un répertoire (et ses sous-répertoires)

avec wgrep vous pouvez éditer le tampon contenant les résultats de votre recherche rgrep.

PuercoPop
la source