Ich muss eine Regex-Suche und Ersetzung für alle Dateien in einem Ordner (und seinen Unterordnern) durchführen. Was wäre der Linux-Shell-Befehl, um das zu tun?
Zum Beispiel möchte ich dies über alle Dateien ausführen und die alte Datei mit dem neuen, ersetzten Text überschreiben.
sed 's/old text/new text/g'
Antworten:
Es gibt keine Möglichkeit, dies nur mit sed zu tun. Sie müssen mindestens das Suchdienstprogramm zusammen verwenden:
Dieser Befehl erstellt eine
.bak
Datei für jede geänderte Datei.Anmerkungen:
-i
Argument für densed
Befehl ist eine GNU-Erweiterung. Wenn Sie diesen Befehl mit den BSDs ausführen, müssensed
Sie die Ausgabe in eine neue Datei umleiten und dann umbenennen.find
Dienstprogramm implementiert das-exec
Argument nicht in alten UNIX-Boxen, daher müssen Sie| xargs
stattdessen ein verwenden.quelle
\;
?-i
selbst keine Sicherungsdatei erstellt wird und sed den Vorgang für die vorhandene Datei ausführt.{}
?{}
wird durch jeden Dateinamen ersetzt, der von gefunden wird,find
und\;
weist darauf hin, dass der Befehl, den er ausführen muss, an diesem Punkt beendet ist.Ich ziehe es zu benutzen
find | xargs cmd
über ,find -exec
weil es leichter zu merken.In diesem Beispiel wird "foo" global durch "bar" in TXT-Dateien in oder unter Ihrem aktuellen Verzeichnis ersetzt:
Die Optionen
-print0
und können-0
weggelassen werden, wenn Ihre Dateinamen keine funky Zeichen wie Leerzeichen enthalten.quelle
find . -type f -name "*.txt" -print0 | xargs -0 sed -i '' "s/foo/bar/g"
(beachten Sie, dass das-i
Argument eine leere Zeichenfolge enthält ).Für die Portabilität verlasse ich mich nicht auf Funktionen von sed, die spezifisch für Linux oder BSD sind. Stattdessen verwende ich das
overwrite
Skript aus Kernighans und Pikes Buch über die Unix-Programmierumgebung.Der Befehl lautet dann
Und das
overwrite
Skript (das ich überall benutze) istDie Idee ist, dass eine Datei nur überschrieben wird, wenn ein Befehl erfolgreich ist. Nützlich in
find
und auch dort, wo Sie nicht verwenden möchtenweil die Shell die Datei abschneidet, bevor
sed
sie gelesen werden kann.quelle
Darf ich vorschlagen (nach dem Sichern Ihrer Dateien):
quelle
Beispiel: Ersetzen Sie {AutoStart} mit 1 für alle INI-Dateien im Ordner / app / config / und seinen untergeordneten Ordnern:
quelle
quelle
Vielleicht möchten Sie mein Massensuch- / Ersetzungs-Perl-Skript ausprobieren . Hat einige Vorteile gegenüber verketteten Utility-Lösungen (z. B. dass nicht mehrere Ebenen der Shell-Metazeichen-Interpretation behandelt werden müssen).
quelle
Falls der Name der Dateien im Ordner einige reguläre Namen hat (wie Datei1, Datei2 ...), die ich für den Zyklus verwendet habe.
quelle