Wie finde und ersetze ich jedes Vorkommen von:
subdomainA.example.com
mit
subdomainB.example.com
in jeder Textdatei unter dem /home/www/
Verzeichnisbaum rekursiv?
Wie finde und ersetze ich jedes Vorkommen von:
subdomainA.example.com
mit
subdomainB.example.com
in jeder Textdatei unter dem /home/www/
Verzeichnisbaum rekursiv?
Eine Erklärung wäre angebracht, vor allem, weil keines der geforderten Werkzeuge verwendet wird (die Frage ist auch mit diesen gekennzeichnet). Was ist z. B. die Idee/der Sinn? Bitte antworten Sie, indem Sie Ihre Antwort bearbeiten, nicht hier in den Kommentaren ( ohne "Bearbeiten:", "Aktualisieren:" oder ähnlich - die Antwort sollte so aussehen, als wäre sie heute geschrieben worden).
Für alle, die Silbersucher ( ag
)
ag SearchString -l0 | xargs -0 sed -i 's/SearchString/Replacement/g'
Da ag standardmäßig git/hg/svn-Dateien und -Ordner ignoriert, ist es sicher, dies innerhalb eines Repositorys auszuführen.
Diese ist mit Git-Repositories kompatibel und etwas einfacher:
Linux:
git grep -l 'original_text' | xargs sed -i 's/original_text/new_text/g'
Mac:
git grep -l 'original_text' | xargs sed -i '' -e 's/original_text/new_text/g'
(Dank an http://blog.jasonmeridth.com/posts/use-git-grep-to-replace-strings-in-files-in-your-git-repository/ )
Um die Anzahl der zu rekursiven Dateien zu reduzieren sed
durch, könnten Sie grep
für Ihre String-Instanz:
grep -rl <oldstring> /path/to/folder | xargs sed -i s^<oldstring>^<newstring>^g
Wenn Sie man grep
werden Sie feststellen, dass Sie auch eine --exlude-dir="*.git"
Flagge, wenn Sie das Durchsuchen von .git-Verzeichnissen auslassen wollen, um Probleme mit dem Git-Index zu vermeiden, auf die andere höflich hingewiesen haben.
Das führt Sie zu:
grep -rl --exclude-dir="*.git" <oldstring> /path/to/folder | xargs sed -i s^<oldstring>^<newstring>^g
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.
114 Stimmen
Tipp: Führen Sie die folgenden Schritte nicht in einem svn-Checkout-Baum durch... es wird die magischen .svn-Ordnerdateien überschreiben.
9 Stimmen
Oh mein Gott, das ist genau das, was ich gerade getan habe. Aber es hat funktioniert und es scheint keinen Schaden angerichtet zu haben. Was könnte schlimmstenfalls passieren?
5 Stimmen
@J.Katzwinkel: Zumindest können die Prüfsummen beschädigt werden, was wiederum Ihr Repository beschädigen kann.
4 Stimmen
Kleiner Tipp für alle, die sed verwenden: Es fügt Zeilenumbrüche an Ihre Dateien an. Wenn Sie das nicht wollen, machen Sie zuerst ein find-replace, das mit nichts übereinstimmt, und übergeben Sie das an Git. Dann führen Sie die echte Ersetzung durch. Dann rebase interaktiv und lösche das erste.
0 Stimmen
@funroll Oder verwenden Sie ein Werkzeug, das das Hinzufügen von Zeilenumbrüchen nicht erzwingt, wie z.B. Perl, oder akzeptieren Sie die Tatsache, dass POSIX strikt vorschreibt, dass Textdateien Zeilenabschlüsse haben müssen.
6 Stimmen
Sie können ein Verzeichnis, wie z. B. git, von den Ergebnissen ausschließen, indem Sie
-path ./.git -prune -o
においてfind . -path ./.git -prune -o -type f -name '*matchThisText*' -print0
vor der Übergabe an xargs0 Stimmen
Diese Antwort auf der Unix-Website StackExchange ist ebenfalls sehr interessant: unix.stackexchange.com/a/112024/354626
0 Stimmen
Alternative Lösung von SuperUser Wie kann ich eine rekursive Suche und Ersetzung über die Befehlszeile durchführen? :
find . -type f \( -iname \*.ht* -o -iname \*.php \) -exec sed -i'' -e 's/findString/replString/g' {} +
(Zeichenketten müssen escaped werden, z.B. Punkte wie\.
) Ignoriert möglicherweise Dateinamen mit Leerzeichen(?)