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?
grep -lr 'subdomainA.example.com' | while read file; do sed -i "s/subdomainA.example.com/subdomainB.example.com/g" "$file"; done
Ich schätze, die meisten Leute wissen nicht, dass sie etwas in eine "while read file" pipen können und so die unangenehmen -print0-Args vermeiden und gleichzeitig Leerzeichen in Dateinamen vermeiden können.
Außerdem wird ein echo
vor dem sed ermöglicht es Ihnen, zu sehen, welche Dateien geändert werden, bevor Sie es tatsächlich tun.
Wenn es Ihnen nichts ausmacht, die vim
zusammen mit grep
o find
Tools können Sie die Antwort des Benutzers Gert unter diesem Link nachlesen --> Wie kann man einen Text in einer großen Ordnerhierarchie ersetzen? .
So sieht es aus:
rekursiv nach der zu ersetzenden Zeichenfolge in einem bestimmten Pfad suchen und nur den vollständigen Pfad der passenden Datei übernehmen. (das wäre dann die $(grep 'string' 'pathname' -Rl)
.
(optional) wenn Sie ein Pre-Backup dieser Dateien in einem zentralen Verzeichnis erstellen möchten, können Sie dies ebenfalls verwenden: cp -iv $(grep 'string' 'pathname' -Rl) 'centralized-directory-pathname'
Danach können Sie nach Belieben bearbeiten/ersetzen in vim
nach einem ähnlichen Schema wie dem auf dem angegebenen Link angegebenen:
:bufdo %s#string#replacement#gc | update
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(?)