Wie suche und ersetze ich eine Reihe von Dateien?


9

Ich möchte eine Reihe von Dateien definieren, in denen ich Text suchen und ersetzen kann.

Zu klären:

Ich möchte in der Lage sein, z. B. in allen Dateien xk * .tex in einem bestimmten Verzeichnis zu suchen (und Sicherungsdateien auszuschließen). Ich möchte auch in der Lage sein, den Ausdruck "Unsicherheit" in "Unbestimmtheit" in allen Dateien dd * .sh und ee * .cls zu ändern.

Was ist der Standardweg, um dies zu tun?


@Claudio Vielleicht möchten Sie einen Blick darauf werfen dired, wie Sie eine Teilmenge von Dateien in einem bestimmten Verzeichnis suchen und ersetzen.
Tintenfisch

Hier ist ein Beispiel zu tun „Suchen / Ersetzen“ in mehreren Dateien in einem Verzeichnis / Projekt mit ag, wgrepund multiple-cursors.
Kaushal Modi

Antworten:


4

Wenn Sie an einem genau definierten Projekt arbeiten, können Sie occurund grepEinrichtungen innerhalb dieses Projekts über verwenden projectile. Ausgehend von seiner Github-Beschreibung kann es unter den verschiedenen Funktionen, die von angeboten werden projectile, Folgendes tun:

  • im Projekt ersetzen
  • mehrfach in Projektpuffern vorkommen
  • grep im Projekt
  • Projekt in dired besuchen

4

Wenn sich alle Dateien im selben Verzeichnis befinden, können Sie die folgenden Schritte ausführen. Ich werde dies auf das zweite Beispiel in den Kommentaren stützen:

  1. M-xdiredum das entsprechende Verzeichnis im diredModus zu öffnen .
  2. %mdired-mark-files-regexpin diesem Verzeichnis ausführen .
  3. Geben Sie ein ^dd.*\.sh$, was dem regulären Ausdruck entspricht dd*.sh. Diese Dateien werden jetzt mit einem gekennzeichnet *und können je nach Farbschema auch in einer anderen Farbe hervorgehoben angezeigt werden.
  4. Wiederholen Sie Schritt 3 so oft wie nötig mit einem beliebigen regulären Ausdruck (z. B. ^ee.*\.cls$), bis alle Dateien, die Sie bearbeiten möchten, markiert sind.
  5. Qum dired-do-query-replace-regexpauf den von Ihnen markierten Dateien ausgeführt zu werden.
  6. Geben Sie uncertaintyund indeterminacyals Abfragezeichenfolgen ein. (Ich denke, dies unterscheidet zwischen Groß- und Kleinschreibung. Wenn Sie die Groß- und Kleinschreibung nicht berücksichtigen müssen, ist möglicherweise ein regulärer Ausdruck erforderlich, aber ich bin mir nicht sicher.)

Und das ist die Idee. Wenn Sie dies einige Male in verschiedenen Ordnern wiederholen müssen, können Sie die Schritte 2 bis 6 als Makro aufzeichnen (drücken Sie C-x (nach Schritt 1 und C-x )nach Schritt 6). Und selbst wenn Sie mit elisp nicht sehr vertraut sind, können Sie dieses Makro mithilfe von elisp in elisp übersetzen insert-kbd-macround versuchen, es in eine nützliche Funktion zu hacken.


1
Bitte beachten Sie, dass in Emacsland S-qnicht bedeutet shift+q, es bedeutet super+q. Sie sollten nur schreiben, Qwenn Sie meinen shift+q. Ich habe Ihren Kommentar bearbeitet, um dies widerzuspiegeln.
Kindermädchen

2
Eigentlich nein, S-qheißt shift+q; super+qwürde geschrieben werden s-q.
Sue D. Nymme

3

Sie können M-x find-name-diredeinen dired-Puffer abrufen, der Links zu allen Dateien enthält, die einem bestimmten Namensmuster entsprechen.

Verwenden Sie M-x find-grep-direddiese Option, um einen dired-Puffer abzurufen, der die Dateien enthält, deren Inhalt mit dem angegebenen grep-Muster übereinstimmt.

Es gibt viel mehr solcher Befehle; Was am besten geeignet ist, hängt von Ihren Anforderungen ab. Bitte aktualisieren Sie Ihre Frage.

Anschließend können Sie die Liste der Dateien mithilfe von Makros durchlaufen. Schauen Sie sich Brians Antwort als Beispiel an: https://emacs.stackexchange.com/a/9497/2005


1

Verwenden Sie rgrep und wgrep.

Mit rgrep können Sie alle nach einem regulären Ausdruck in Dateien suchen, deren Dateiname mit einem regulären Ausdruck übereinstimmt, und in einem Verzeichnis (und seinen Unterverzeichnissen).

Mit wgrep können Sie den Puffer bearbeiten, der die Ergebnisse Ihrer rgrep-Suche enthält.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.