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.

7voto

J.Hpour Punkte 911

Nach Angaben von ce Blogbeitrag:

find . -type f | xargs perl -pi -e 's/oldtext/newtext/g;'

7voto

MadMan2064 Punkte 416

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.

6voto

RikHic Punkte 69

Versuchen Sie dies:

sed -i 's/subdomainA/subdomainB/g' `grep -ril 'subdomainA' *`

5voto

petrus4 Punkte 508
#!/usr/local/bin/bash -x

find * /home/www -type f | while read files
do

sedtest=$(sed -n '/^/,/$/p' "${files}" | sed -n '/subdomainA/p')

    if [ "${sedtest}" ]
    then
    sed s'/subdomainA/subdomainB/'g "${files}" > "${files}".tmp
    mv "${files}".tmp "${files}"
    fi

done

4voto

mzcl-mn Punkte 31

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