853 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

12voto

"Sie könnten auch find und sed verwenden, aber ich finde, dass diese kleine Perl-Zeile gut funktioniert.

perl -pi -w -e 's/search/replace/g;' *.php
  • -e bedeutet, dass die folgende Codezeile ausgeführt wird.
  • -i bedeutet "an Ort und Stelle bearbeiten
  • -w Schreibwarnungen
  • -p-Schleife

" (Auszug aus http://www.liamdelahunty.com/tips/linux_search_and_replace_multiple_files.php )

Die besten Ergebnisse erhalte ich, wenn ich perl und grep verwende (um sicherzustellen, dass die Datei den Suchausdruck enthält)

perl -pi -w -e 's/search/replace/g;' $( grep -rl 'search' )

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

6voto

Marquistador Punkte 1611

Auf einem MacBook Pro habe ich folgendes verwendet (inspiriert von https://stackoverflow.com/a/19457213/6169225 ):

sed -i '' -e 's/<STR_TO_REPLACE>/<REPLACEMENT_STR>/g' *

-i '' stellt sicher, dass Sie keine Sicherungskopien erstellen.

-e für moderne Regex.

5voto

manuelvigarcia Punkte 1138

Ich habe meine eigene Lösung ausgeheckt, bevor ich diese Frage (und Antworten) fand. Ich habe nach verschiedenen Kombinationen von "replace", "several" und "xml" gesucht, weil das meine Anwendung war, aber ich habe diese spezielle nicht gefunden.

Mein Problem: Ich hatte Spring-Xml-Dateien mit Daten für Testfälle, die komplexe Objekte enthielten. Ein Refactor am Java-Quellcode änderte viele Klassen und betraf nicht die Xml-Dateien. Um die Daten der Testfälle zu speichern, musste ich alle Klassennamen in allen Xml-Dateien ändern, die über mehrere Verzeichnisse verteilt waren. Gleichzeitig musste ich Sicherungskopien der ursprünglichen Xml-Dateien speichern (obwohl dies nicht unbedingt erforderlich war, da die Versionskontrolle mir hier helfen würde).

Ich suchte nach einer Kombination aus find + sed weil es bei mir in anderen Situationen funktioniert hat, aber nicht bei mehreren Vertretungen auf einmal.

Dann fand ich ask ubuntu Antwort und es hat mir geholfen, meine Kommandozeile aufzubauen:

find -name "*.xml" -exec sed -s --in-place=.bak -e 's/firstWord/newFirstWord/g;s/secondWord/newSecondWord/g;s/thirdWord/newThirdWord/g' {} \;

Und es hat perfekt funktioniert (in meinem Fall gab es sechs verschiedene Ersatzgeräte). Aber bitte beachten Sie, dass alle *.xml-Dateien im aktuellen Verzeichnis betroffen sind. Aus diesem Grund, und wenn Sie einem Versionskontrollsystem verpflichtet sind, sollten Sie zuerst filtern und nur an sed die tatsächlich die gewünschten Zeichenfolgen haben; z. B.:

find -name "*.xml" -exec grep -e "firstWord" -e "secondWord" -e "thirdWord" {} \; -exec sed -s --in-place=.bak -e 's/firstWord/newFirstWord/g;s/secondWord/newSecondWord/g;s/thirdWord/newThirdWord/g' {} \;

5voto

Justin Killen Punkte 720

Wirklich lahm, aber ich konnte keinen der sed-Befehle unter OSX richtig zum Laufen bringen, also habe ich stattdessen diese dumme Sache gemacht:

:%s/foo/bar/g
:wn

^- diese drei Zeilen in die Zwischenablage kopieren (ja, einschließlich des abschließenden Zeilenumbruchs), dann:

vi *

und halten Sie die Befehlstaste-v gedrückt, bis es heißt, dass keine Dateien mehr vorhanden sind.

Dumm...hakelig...effektiv...

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