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

39voto

Djacomo Punkte 505

Um eine Zeichenkette in mehreren Dateien zu ersetzen, können Sie verwenden:

grep -rl string1 somedir/ | xargs sed -i 's/string1/string2/g'

z.B.

grep -rl 'windows' ./ | xargs sed -i 's/windows/linux/g'

Quelle: Blog

38voto

Ignorant Punkte 2222

Angenommen, Sie wollen nach der Zeichenkette search und ersetzen Sie es durch replace über mehrere Dateien hinweg, ist dies meine kampferprobte, einzeilige Formel :

grep -RiIl 'search' | xargs sed -i 's/search/replace/g'

Kurze Erklärung von grep:

  • -R - rekursive Suche
  • -i - unabhängig von Groß- und Kleinschreibung
  • -I - Überspringen von Binärdateien (Sie wollen Text, richtig?)
  • -l - eine einfache Liste als Ausgabe drucken. Benötigt für die anderen Befehle

Die grep-Ausgabe wird dann (über xargs) an sed weitergeleitet, das zum Ersetzen von Text verwendet wird. Die -i Flagge wird die Datei direkt geändert. Entfernen Sie es für eine Art "Trockenlauf"-Modus.

33voto

Ilya Suzdalnitski Punkte 51083

Um einen Pfad innerhalb von Dateien zu ersetzen (unter Vermeidung von Escape-Zeichen), können Sie den folgenden Befehl verwenden:

sed -i 's@old_path@new_path@g'

Das @-Zeichen bedeutet, dass alle Sonderzeichen in einer folgenden Zeichenkette ignoriert werden sollen.

25voto

gopiariv Punkte 434

Falls Ihre Zeichenkette einen Schrägstrich (/) enthält, können Sie das Trennzeichen in '+' ändern.

find . -type f -exec sed -i 's+http://example.com+https://example.com+g' {} +

Dieser Befehl würde im aktuellen Verzeichnis rekursiv ausgeführt.

12voto

jiasir Punkte 121

Die erste Zeile, in der "foo" vorkommt, wird durch "bar" ersetzt. Und Sie können die zweite Zeile zur Überprüfung verwenden.

grep -rl 'foo' . | xargs sed -i 's/foo/bar/g'
grep 'foo' -r * | awk -F: {'print $1'} | sort -n | uniq -c

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