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.

4voto

sarath kumar Punkte 332

Sie können awk verwenden, um dies wie folgt zu lösen,

for file in `find /home/www -type f`
do
   awk '{gsub(/subdomainA.example.com/,"subdomainB.example.com"); print $0;}' $file > ./tempFile && mv ./tempFile $file;
done

Ich hoffe, das wird Ihnen helfen!!

4voto

Perseids Punkte 11484

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.

3voto

NeronLeVelu Punkte 9584

Nur um zu vermeiden, dass sich auch

  • Beinahe-SubdomainA.beispiel.com
  • subdomainA.beispiel.comp.andere

aber dennoch

  • subdomainA.beispiel.com.IsIt.gut

(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' {} \;

3voto

bbarker Punkte 9463

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'

3voto

Marcus Floyd Punkte 19

Wenn Sie dies nutzen möchten, ohne Ihr SVN-Repository komplett zu zerstören, können Sie "find" anweisen, alle versteckten Dateien zu ignorieren:

find . \( ! -regex '.*/\..*' \) -type f -print0 | xargs -0 sed -i 's/subdomainA.example.com/subdomainB.example.com/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