Ich muss eine Zeichenfolge in einer Menge von Dateien in einem Ordner ersetzen, mit nur ssh
Zugang zum Server. Wie kann ich das tun?
Antworten
Zu viele Anzeigen?"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' )
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.
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' {} \;
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...
1 Stimmen
Wenn Sie es vorziehen, Notepad++ anstelle der Befehlszeile zu verwenden, fand ich dies sehr hilfreich: superuser.com/a/1003801/74576