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.
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.
Hier sind die grundlegenden Schritte, die ich machen würde
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).
Wenn sich alle Dateien in einem Verzeichnis befinden, können Sie Folgendes tun:
ls * .txt | xargs scriptFromStep2.sh
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)
Benutze dieses Tool, das in Perl geschrieben ist - mit ziemlich viel Schnickschnack - Oldie, aber Goodie:
Features:
Dieses Skript wurde im Laufe der Jahre bei umfangreichen Datensätzen sehr häufig verwendet.
Tags und Links replace unix batch-file