Shell-Skript - Suchen und Ersetzen von Text in mehreren Dateien mithilfe einer Liste von Zeichenfolgen

8

Ich habe eine Datei "changesDictionary.txt", die (eine variable Anzahl von) Paaren von Schlüssel / Wert-Strings enthält.

z.B.

"textToSearchFor"="theReplacementText"

(Das Format des Wörterbuchs ist unwichtig und kann nach Bedarf geändert werden.)

Ich muss den Inhalt eines bestimmten Verzeichnisses durchlaufen, einschließlich der Unterverzeichnisse. Für jede Datei mit der Erweiterung ".txt" suchen wir nach jeder der Schlüssel in changesDictionary.txt und ersetzen jede gefundene Instanz durch den Ersetzungsstringwert.

d. Suchen und ersetzen Sie mehrere Dateien, aber verwenden Sie eine Liste von Begriffen zum Suchen / Ersetzen anstelle eines einzelnen Suchbegriffs.

Wie könnte ich das tun? (Ich habe einzelne Such- / Ersetzungsbeispiele studiert, verstehe aber nicht, wie man mehrere Suchen in einer Datei durchführt.)

Die Implementierung (bash, perl, was auch immer) ist nicht wichtig, solange ich sie über die Befehlszeile in Mac OS X ausführen kann. Danke für jede Hilfe.

    
SirRatty 16.03.2009, 00:21
quelle

4 Antworten

6

Ich würde die Datei changesDictionary.txt in ein sed-Skript mit ... sed:

konvertieren %Vor%

Hinweis , alle Sonderzeichen für reguläre Ausdrücke oder sed-Ausdrücke in Ihrem Wörterbuch werden von sed falsch interpretiert, sodass Ihr Wörterbuch entweder nur primitivste Suchen und Ersetzen haben kann, oder Sie müssen die Sed-Datei mit gültigen Ausdrücken pflegen. Leider gibt es in sed keinen einfachen Weg, um reguläre Ausdrücke auszuschalten und nur Zeichenfolgen zu verwenden oder Ihre Suchen und Ersetzungen als "Literale" zu zitieren.

Mit dem resultierenden sed-Skript verwenden Sie find und xargs - anstatt find -exec -, um Ihre Dateien mit dem sed-Skript so schnell wie möglich zu konvertieren, indem Sie sie mehr als eines bei a verarbeiten Zeit.

%Vor%

Hinweis , die Option -i von sed bearbeitet Dateien "in-place", also stellen Sie Sicherungskopien sicher, oder verwenden Sie -i~ , um Tilde-Backups zu erstellen.

Schlussnotiz kann durch Suchen und Ersetzen unbeabsichtigte Konsequenzen haben. Haben Sie Suchen, die Teilzeichenfolgen anderer Suchen sind? Hier ist ein Beispiel.

%Vor%

Sollte "fixThat" "Fixed" oder "broken That" geworden sein? Bestellangelegenheiten für sed-Skript. In ähnlicher Weise kann ein Suchen und Ersetzen mehr als einmal gesucht und ersetzt werden - Ändern von "a" zu "b", kann durch ein anderes Suchen und Ersetzen später von "b" zu "c" geändert werden.

Vielleicht haben Sie beide schon in Betracht gezogen, aber ich erwähne das, weil ich versucht habe, was Sie vorher gemacht haben und nicht daran gedacht habe. Ich weiß nichts von dem, was einfach das Richtige tut um mehrere Suchen und Ersetzungen auf einmal durchzuführen. Also müssen Sie es programmieren, um das Richtige selbst zu tun.

    
ashawley 16.03.2009 19:07
quelle
5

Hier sind die grundlegenden Schritte, die ich machen würde

  1. Kopieren Sie die Datei changesDictionary.txt
  2. Ersetzen Sie darin "a"="b" der äquivalenten Sed-Linie: z. (Verwenden Sie $ 1 für den Dateinamen)

    sed -e 's / a / b / g' $ 1

    (Sie könnten ein Skript schreiben, um dies zu tun oder einfach von Hand, wenn Sie das nur einmal machen müssen und es nicht zu groß ist).

  3. Wenn sich alle Dateien in einem Verzeichnis befinden, können Sie Folgendes tun:

    ls * .txt | xargs scriptFromStep2.sh

  4. Wenn sie sich in Unterverzeichnissen befinden, verwenden Sie eine Suche, um dieses Skript für alle Dateien aufzurufen, etwa

    finden. -name '* .txt' -exec scriptFromStep2.sh {} \;

Diese sind nicht genau, machen einige Experimente, um sicherzustellen, dass Sie es richtig machen - es ist nur der Ansatz, den ich verwenden würde.

(aber wenn du kannst, benutze einfach perl, es wäre viel einfacher)

    
Lou Franco 16.03.2009 00:31
quelle
2

Benutze dieses Tool, das in Perl geschrieben ist - mit ziemlich viel Schnickschnack - Oldie, aber Goodie:

Ссылка

Features:

  • führt mehrere Suchvorgänge aus - ersetzen oder abfragen - suchen - ersetzen -
  • search-replace-Ausdrücke können in der Befehlszeile angegeben oder aus einer Datei
  • gelesen werden
  • verarbeitet mehrere Eingabedateien
  • steigt rekursiv in das Verzeichnis ein und führt mehrere Such- / Ersetzungsoperationen für alle Dateien durch
  • benutzerdefinierte Perl-Ausdrücke werden auf jede Zeile jeder Eingabedatei angewendet
  • optional im Absatzmodus (für mehrzeilige Suche / ersetzen)
  • interaktiver Modus
  • Batch-Modus
  • optional Backup-Dateien und Backup-Nummerierung
  • bewahrt Modi / Besitzer, wenn sie als root
  • ausgeführt werden
  • ignorieren Sie symbolische Links, leere Dateien, schreiben Sie geschützte Dateien, Sockets, Named Pipes und Verzeichnisnamen
  • ersetzt optional Zeilen, die nur mit einem bestimmten regulären Ausdruck übereinstimmen

Dieses Skript wurde im Laufe der Jahre bei umfangreichen Datensätzen sehr häufig verwendet.

    
Tilo 26.03.2011 04:10
quelle
1
%Vor%     
ghostdog74 06.08.2009 14:22
quelle

Tags und Links