Linux Search and Replace-Beispiel

Beispiel für das Suchen und Ersetzen von Linux

Vor kurzem musste ich Text ändern, der in einer Reihe von Konfigurationsdateien in verschachtelten Unterverzeichnissen enthalten war. Da ich keine Zeit hatte, 10 Jahre alte Perl-Fähigkeiten abzuwischen, suchte ich nach Shell-Befehlen, die funktionieren würden. Überraschenderweise gibt es im Web viele Beispiele, dienotfunktionieren, und so kam ich zu folgenden Variationen:

Testen Sie diese zuerst und studieren Sie, wie sie funktionieren. In beiden Fällen liefern wir eine Liste der gewünschten Dateien an den Linux-Befehl "sed", wobei xargs zum Erstellen des Befehls sed verwendet wird (eine interessante Zusammenfassung von xargs finden Sie unterthis article).

1. Alle Dateien suchen und ersetzen

Wenn Sie einen bestimmten Textsatz in einem Dateisatz ersetzen müssen, aber nicht wissen, welche Dateien den gesuchten Text enthalten können, kann dies hilfreich sein:

grep -lr -e 'old text' * | xargs sed -i 's/old text/new text/g'

Wenn wir hier grep verwenden, suchen wir rekursiv (die Option "-r") nach Dateien, die den Text "alter Text" enthalten. Mit Regex können Sie hier wirklich kreativ werden, was durch die Option „-e“ erleichtert wird.

Grep bietet die Liste der Dateien (die Option "-l"), für die das eigentliche Suchen und Ersetzen durchgeführt werden soll (Sie können diesen Teil alleine ausführen, um seine Ausgabe zu sehen). Diese Liste von Dateien wird dann an den Befehl set weitergeleitet, der dann die eigentliche Arbeit des Suchens und Ersetzens des alten Textes durch neuen Text erledigt.

Die Option "-i" von sed führt zu einer direkten Bearbeitung, was bedeutet, dass die Originaldatei geändert wird (in meiner Situation war dies erforderlich - aber sed kann angewiesen werden, ein Backup zu erstellen, wenn Sie es mit -i angeben). Das "s" in "s / ..." bedeutet "Ersatz" und das "g" bedeutet "globaler Ersatz" - genau das passiert.

2. Suchen und Ersetzen der angegebenen Datei

Wenn Sie den Namen der zu aktualisierenden Datei kennen, können Sie diese Variante verwenden:

find -name myconfig_file.txt | xargs sed -i 's/old text/new text/g'

Dies ist im Grunde die gleiche Idee, verwendet jedoch stattdessen die Suchoperation, um eine Liste von Dateien bereitzustellen, die dem angegebenen Namen entsprechen. Dies durchläuft alle Unterverzeichnisse ab dem aktuellen Stand. Die Liste der Dateien wird dann auf die gleiche Weise wie oben beschrieben an sed weitergeleitet.

P.S Above command tested on Ubuntu and RedHat