847 Stimmen

Wie ersetzt man eine Zeichenkette in mehreren Dateien in der Linux-Befehlszeile?

Ich muss eine Zeichenfolge in einer Menge von Dateien in einem Ordner ersetzen, mit nur ssh Zugang zum Server. Wie kann ich das tun?

1 Stimmen

Wenn Sie es vorziehen, Notepad++ anstelle der Befehlszeile zu verwenden, fand ich dies sehr hilfreich: superuser.com/a/1003801/74576

1012voto

kev Punkte 145226
cd /path/to/your/folder
sed -i 's/foo/bar/g' *

Vorkommnisse von "foo" werden durch "bar" ersetzt.

Auf BSD-Systemen wie macOS müssen Sie eine Backup-Erweiterung wie -i '.bak' andernfalls "riskieren Sie die Beschädigung oder einen unvollständigen Inhalt", wie es in der Manpage heißt.

cd /path/to/your/folder
sed -i '.bak' 's/foo/bar/g' *

396voto

Céline Aussourd Punkte 9176

Ähnlich wie die Antwort von Kaspar, aber mit dem Flag g, um alle Vorkommen in einer Zeile zu ersetzen.

find ./ -type f -exec sed -i 's/old_string/new_string/g' {} \;

Bei globaler Groß- und Kleinschreibung wird nicht unterschieden:

find ./ -type f -exec sed -i 's/old_string/new_string/gI' {} \;

369voto

pymarco Punkte 6997

Die Antwort von @kev ist gut, betrifft aber nur Dateien im unmittelbaren Verzeichnis. Das folgende Beispiel verwendet grep, um Dateien rekursiv zu finden. Das funktioniert bei mir jedes Mal.

grep -rli 'old-word' * | xargs -i@ sed -i 's/old-word/new-word/g' @

Aufschlüsselung der Befehle

grep -r : --Rekursiv rekursiv alle Dateien in jedem Verzeichnis lesen.
grep -l : --print-with-matches gibt den Namen jeder Datei aus, die eine Übereinstimmung aufweist, anstatt die übereinstimmenden Zeilen zu drucken.
grep -i : --ignore-case .

xargs STDIN in Argumente umwandeln, wie folgt répondre .
xargs -i@ ~Befehl enthält @~ : ein Platzhalter für das Argument, das an einer bestimmten Stelle im Text verwendet werden soll ~Befehl~ Das @-Zeichen ist ein Platzhalter, der durch eine beliebige Zeichenfolge ersetzt werden kann.

sed -i : Dateien an Ort und Stelle bearbeiten, ohne Backups.
sed s/regexp/Ersatz/ : Abgleich von Ersatzzeichenfolgen regexp con Ersatz .
sed s/regexp/Ersatz/ g : weltweit machen Sie die Ersetzung für jede Übereinstimmung und nicht nur für die erste Übereinstimmung.

72voto

jlevy Punkte 2688

Hierzu gibt es bereits einige Standardantworten. Im Allgemeinen können Sie verwenden finden. um die Dateien rekursiv aufzulisten und dann die Operationen mit sed o perl .

rpl

Für die meisten schnellen Anwendungen ist der Befehl rpl ist viel leichter zu merken.

Ersetzen Sie foo con bar für alle .txt Dateien:

rpl -v foo bar '*.txt' 

Simulieren Sie das Ersetzen der Regex foo.* con bar in allen .txt Dateien rekursiv:

rpl --dry-run 'foo.*' bar '**/*.txt'

Sie müssen es wahrscheinlich installieren ( apt-get install rpl oder ähnlich).

Repräsentieren

Für anspruchsvollere Aufgaben, die reguläre Ausdrücke und Rücksubstitution oder Dateiumbenennungen sowie Suchen und Ersetzen beinhalten, ist das allgemeinste und leistungsfähigste Tool, das ich kenne, Repräsentieren ein kleines Python-Skript, das ich vor einer Weile für einige schwierigere Umbenennungs- und Refactoring-Aufgaben geschrieben habe. Die Gründe, warum Sie es bevorzugen könnten, sind:

  • Unterstützt das Umbenennen von Dateien sowie das Suchen und Ersetzen von Dateiinhalten.
  • Sehen Sie sich die Änderungen an, bevor Sie das Suchen und Ersetzen durchführen.
  • Unterstützung von regulären Ausdrücken mit Rückwärtssubstitution, ganzen Wörtern, Groß-/Kleinschreibung nicht berücksichtigend und Groß-/Kleinschreibung erhaltend (replace foo -> bar, Foo -> Bar, FOO -> BAR).
  • Funktioniert mit mehreren Ersetzungen, einschließlich Vertauschungen (foo -> bar und bar -> foo) oder Mengen von nicht eindeutigen Ersetzungen (foo -> bar, f -> x).

Zur Verwendung, pip install repren . Prüfen Sie die README für Beispiele.

62voto

Kaspar L. Palgi Punkte 1038

Das hat bei mir funktioniert:

find ./ -type f -exec sed -i 's/string1/string2/' {} \;

Dies war jedoch nicht der Fall: sed -i 's/string1/string2/g' * . Vielleicht war "foo" nicht als String1 und "bar" nicht als String2 gedacht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X