Wie kann ich unter Linux in allen PHP-Dateien rekursiv einen String ersetzen?

2841
Peter Mortensen

Ich habe einen Funktionsnamen, der falsch geschrieben wurde, und ich möchte ihn ändern. Die Funktion wird an vielen Stellen des Projekts aufgerufen.

Wie kann ich dies mit einem Linux-Befehl unter SUSE tun ?

3

4 Antworten auf die Frage

4
John T

Sie können eine Kombination von verwenden find, xargsund sed:

find ./ -type f -name "*.php" | xargs sed -i 's/\<oldfunction\>/newfunction/g' 
Vorsicht dort! Als / er / er / auf meinen Kommentar zu tun, würde "da" kaputtgehen, und das wäre schwer zu beheben, als einfach! Nehmen Sie zuerst Backups und denken Sie daran, dass Sed Regex verwendet, so dass Sie beim Schreiben Ihrer Parameter einen großen Spielraum haben. Phoshi vor 14 Jahren 0
du hast recht, fixiert. John T vor 14 Jahren 0
Schneiden Sie nicht die umgebenden `<>` Zeichen ab? willst du nicht s / \/ \/ g` oder erkenne ich kein std RE-Element? quack quixote vor 14 Jahren 0
Ja, es sind Wortgrenzen, ich habe vergessen, sie hinzuzufügen, aber Phoshi erinnerte mich daran. Ohne `\ <` (Wortanfang) und `\>` (Wortende) wird der erste String in der Datei ersetzt. Wenn seine Funktion beispielsweise "len" heißt, wird sie auch die "len" in "strlen" ersetzen, und in jeder Datei wird len in jeder Datei gefunden, unabhängig davon, ob es sich um ein einzelnes Wort oder einen Teil einer Station handelt. Dies ist nicht das, was er will . Sie müssen sicherstellen, dass Sie nur vollständige Wörter ersetzen, da sed keine "Wörter" ohne sie kennt. John T vor 14 Jahren 1
Ich dachte, es könnte sein, aber ich konnte keine schnelle Sed-Regex-Referenz finden. Vielen Dank! quack quixote vor 14 Jahren 0
2
Doug Harris

Eine Variante mit Perl :

find . -type f -name "*.php" -print0 | xargs -0 perl -pi.bak -e 's/oldfunction/newfunction/g' 

Ein Vorteil dabei ist, dass Perl die Sicherungsdateien (mit der .bakErweiterung) erstellt, sodass Sie, wenn Sie es vermasseln, zurückkehren können.

(Die -print0Option zum Suchen und die -0Option für xargs werden nur benötigt, wenn Sie Dateien oder Verzeichnisse mit Leerzeichen enthalten.)

Ich denke, dass die Sed-Versionen dies auch tun werden, wenn Sie "-i .bak" anstelle von "-i" verwenden quack quixote vor 14 Jahren 0
aha, ich habe gerade RTFM und ~ quack hat recht. sed wird das auch tun. Doug Harris vor 14 Jahren 0
Ich würde gerne die Python-Variante sehen (ich versuche es zu lernen) :) Pitto vor 12 Jahren 0
1
Nasir

Dies ist genau das gleiche wie die Lösung von John T.

find ./ -type f -name "*.php" -exec sed -i 's/\<oldfunction\>/newfunction/g' {} \; 

Ich pfeife normalerweise nicht zu xargs

BEARBEITEN: teurer ... per Kommentar unten.

Es gibt einen Unterschied: Dies führt eine separate Instanz von `sed` für jede gefundene Datei aus. Die `xargs`-Version führt eine Instanz mit vielen Argumenten aus. quack quixote vor 14 Jahren 0
yep, mehr Gabelung beteiligt. John T vor 14 Jahren 0
Wenn Ihr Fund dies unterstützt, verwenden Sie "+" anstelle von "\;". Dadurch wird die Anzahl der sed-Prozesse reduziert, sodass xargs imitiert wird. Doug Harris vor 14 Jahren 1
habe nie darauf geachtet ... danke für die Klarstellung. Nasir vor 14 Jahren 0
0
CarlF

Ergänzung zu den anderen sehr guten Vorschlägen: Machen Sie ein Backup der gesamten Site (cp -r / var / www / var / wold) und nehmen Sie die Bearbeitung dort vor. Ich persönlich würde dann die modifizierten Dateien verschieben, zum Beispiel / var / www / geändert und http: //www.sitename.tld/changed testen, um sicherzustellen, dass alle Skripte funktionieren, bevor sie live geschaltet werden.