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?
Um alle Vorkommen in einem Git-Repository zu ersetzen, können Sie verwenden:
git ls-files -z | xargs -0 sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g'
Ver Dateien im lokalen Git Repo auflisten? für andere Optionen, um alle Dateien in einem Repository aufzulisten. Die -z
Optionen weist git an, die Dateinamen mit einem Null-Byte zu trennen, was sicherstellt, dass xargs
(mit der Option -0
) können Dateinamen getrennt werden, auch wenn sie Leerzeichen oder Ähnliches enthalten.
Nur um zu vermeiden, dass sich auch
aber dennoch
(vielleicht nicht gut in der Idee hinter Domain Root)
find /home/www/ -type f -exec sed -i 's/\bsubdomainA\.example\.com\b/\1subdomainB.example.com\2/g' {} \;
Hier ist eine Version, die allgemeiner sein dürfte als die meisten anderen; sie erfordert nicht find
(mit du
stattdessen), zum Beispiel. Es erfordert xargs
die nur in einigen Versionen von Plan 9 (wie 9front) enthalten sind.
du -a | awk -F' ' '{ print $2 }' | xargs sed -i -e 's/subdomainA\.example\.com/subdomainB.example.com/g'
Wenn Sie Filter wie Dateierweiterungen hinzufügen möchten, verwenden Sie grep
:
du -a | grep "\.scala$" | awk -F' ' '{ print $2 }' | xargs sed -i -e 's/subdomainA\.example\.com/subdomainB.example.com/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(?)