904 Stimmen

Wie kann ich ein rekursives Suchen/Ersetzen einer Zeichenkette mit awk oder sed durchführen?

Wie finde und ersetze ich jedes Vorkommen von:

subdomainA.example.com

mit

subdomainB.example.com

in jeder Textdatei unter dem /home/www/ Verzeichnisbaum rekursiv?

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.

42voto

Employed Russian Punkte 180738
cd /home/www && find . -type f -print0 |
      xargs -0 perl -i.bak -pe 's/subdomainA\.example\.com/subdomainB.example.com/g'

1 Stimmen

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).

37voto

Jacob Wang Punkte 3961

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.

23voto

seddonym Punkte 15126

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/ )

19voto

inetphantom Punkte 2238

Eine unkomplizierte Methode, wenn Sie Verzeichnisse ausschließen ( --exclude-dir=..folder ) und könnte auch haben Dateinamen mit Leerzeichen (gelöst durch Verwendung von 0Byte für beide grep -Z y xargs -0 )

grep -rlZ oldtext . --exclude-dir=.folder | xargs -0 sed -i 's/oldtext/newtext/g'

19voto

domdambrogia Punkte 1879

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.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