gnude
Anmeldungsdatum: 11. Juli 2014
Beiträge: 806
|
Hallo,
ich bräuchte jemanden der mir mal eben ein kleines Script schreibt.
Es geht darum n einer Reihe von PHP Dateien,
also *.php
einen Textstring in allen Dateien auszutauschen,
also
Ersetzte in allen *.php Dateien Text "Suchmich" durch "Ersetzmich" Das geht bestimmt zügig, aber ich weiss jetzt nicht wie....
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
gnude schrieb:
ich bräuchte jemanden der mir mal eben ein kleines Script schreibt.
Tut mir leid, das hier ist kein Dienstleistungsportal. Wir geben Hilfe zur Selbsthilfe.
Es geht darum n einer Reihe von PHP Dateien,
also *.php
einen Textstring in allen Dateien auszutauschen,
also
Ersetzte in allen *.php Dateien Text "Suchmich" durch "Ersetzmich" Das geht bestimmt zügig, aber ich weiss jetzt nicht wie....
Das können sogar viele Editoren einfach so. Dafür benötigst Du kein Script.
|
unbuntuS12
Anmeldungsdatum: 2. Juni 2010
Beiträge: 1816
|
|
fleet_street
Top-Wikiautor
Anmeldungsdatum: 30. August 2016
Beiträge: 2143
Wohnort: Hunsrück
|
Wieso nicht allgemein auf http://tldp.org/LDP/abs/html/ verweisen? Fertig. 🙄 Hier eine Rohfassung. Die anzupassen bedeutet schon genug Arbeit. Bitte erst an Kopien testen und nicht direkt auf das einzige Original loslassen. | #!/bin/bash
Verzeichnis=/hier/verzeichnis/eingeben
for i in $(find $Verzeichnis -name *.php); do
sed -i 's/Suchmich/Ersetzmich/g' $i
done
|
Was noch nicht berücksichtigt ist:
Sonderzeichen im Pfad oder Dateinamen Sonderzeichen in Suchmich oder Ersetzmich Suchmich kann u. U. Teil eines längeren Wortes sein, z. B. usb soll mit sd ersetzt werden, dann wird aus ausbessern unerwartet asdessern ggf. sollen die Unterverzeichnisse nicht mit durchsucht werden …
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Hi fleet_street, willkommen hier auf dem Forum ! Wenn Du schon ein fix-und-fertiges Skript lieferst, dann bitte nicht mit sowas gemeingefährlichem wie Du da in Zeile 3 gemacht hast ! Die Ausgabe von find zu parsen ist einfach ein No-Go !! - und sauber "gequotet" ist es auch nicht. - da könnte man eine Konstruktion mit find -exec bash -c "sed -i 's/Suchmich/Ersetzmich/g'" {}\; o.ä. nehmen, aber nicht sowas ! Es hat schon seinen guten Grund, dass die alten Hasen hier erstmal ein paar Fragen stellen, bevor sie ein Skript ausspucken und nicht mit dem ersten Halbwissen direkt losskripten. Wir wissen z.B. noch nicht einmal, ob in den *.php- Skripten nicht noch weitere Gemeinheiten drin stecken und wie das Suchwort aussieht ! _ (Stichwort: Sonderbedeutungen in Regulären Ausdrücken) Da muss der Strang-Ersteller schon ein bisschen aktiv mitmachen, sonst wird das nix. LG, track
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
track schrieb:
Wenn Du schon ein fix-und-fertiges Skript lieferst, dann bitte nicht mit sowas gemeingefährlichem wie Du da in Zeile 3 gemacht hast ! Die Ausgabe von find zu parsen ist einfach ein No-Go !! - und sauber "gequotet" ist es auch nicht.
Full ACK.
- da könnte man eine Konstruktion mit find -exec bash -c "sed -i 's/Suchmich/Ersetzmich/g'" {}\; o.ä. nehmen, aber nicht sowas !
Lieber ohne bash . 😉
Es hat schon seinen guten Grund, dass die alten Hasen hier erstmal ein paar Fragen stellen, bevor sie ein Skript ausspucken und nicht mit dem ersten Halbwissen direkt losskripten. Wir wissen z.B. noch nicht einmal, ob in den *.php- Skripten nicht noch weitere Gemeinheiten drin stecken und wie das Suchwort aussieht ! _ (Stichwort: Sonderbedeutungen in Regulären Ausdrücken)
Auch ein guter Punkt!
Da muss der Strang-Ersteller schon ein bisschen aktiv mitmachen, sonst wird das nix.
Sehe ich auch so. Dazu auch als Tipp für gnude: Richtig fragen.
|
fleet_street
Top-Wikiautor
Anmeldungsdatum: 30. August 2016
Beiträge: 2143
Wohnort: Hunsrück
|
track schrieb: willkommen hier auf dem Forum !
Danke ☺ Wenn Du schon ein fix-und-fertiges Skript lieferst, …
Ich meine etwas von „Rohfassung“ geschrieben zu haben. Und wo Probleme bestehen. - da könnte man eine Konstruktion mit … o.ä. nehmen, …!
Prima, so lerne ich doch auch dazu.
|
frostschutz
Anmeldungsdatum: 18. November 2010
Beiträge: 7657
|
fleet_street schrieb: Ich meine etwas von „Rohfassung“ geschrieben zu haben. Und wo Probleme bestehen.
-name *.php ist schon alleine für sich genommen ein Problem. Je nachdem ob in dem Verzeichnis, in dem man es ausführt, PHP-Dateien liegen oder nicht, kommt etwas anderes dabei heraus. (find sieht entweder -name *.php oder -name foobar.php barfoo.php ). Wenn find das * sehen soll, muss das daher immer in "", sonst bekommst du irgendwann ganz kryptische Fehler dabei heraus... Wenn jemand selber was schreibt (so wie du) kann man den ein oder anderen Verbesserungsvorschlag machen, wenn gar nichts kommt (vom TE) ist halt schwierig. 😉 Meine Rohfassung: sed -e 's/suchmich/ersetzmich/g' -i *.php */*.php */*/*.php Aber nachher nicht jammern wenn die Dateien alle kaputt sind, weil man das falsche gesucht/ersetzt hat. find braucht man eigentlich nur wenn der Verzeichnisbaum wirklich nicht mehr überschaubar ist oder wenn man kompliziertere Filter haben will (nach Datum, Größe, ...). Wenn man ohne find auskommt mache ich ohne...
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11179
Wohnort: München
|
frostschutz schrieb: sed -e 's/suchmich/ersetzmich/g' -i *.php */*.php */*/*.php
Da könnte man auch die globstar-Option der Bash (zsh kann das glaube ich auch) nutzen, wenn man rekursiv nach *.php suchen will:
(shopt -s globstar; sed -i 's/Suchmich/Ersetzmich/g' **/*.php)
Man muss bei umfangreichen Ergebnissen nur darauf achten, dass die maximal Argumentgröße nicht überschritten wird - eine Schleife verhindert da potentielle Probleme:
(shopt -s globstar; for f in **/*.php; do sed -i 's/Suchmich/Ersetzmich/g' "$f"; done)
Mit find dürfte das aber flotter gehen, gerade wenn es da noch das Kriterium gibt, dass nur Dateien gefunden werden sollen:
find . -name "*.php" -type f -exec sed -i 's/Suchmich/Ersetzmich/g' {} +
|
frostschutz
Anmeldungsdatum: 18. November 2010
Beiträge: 7657
|
shopt nutze ich nie ☺ also wenns soweit geht bin ich doch wieder bei find
dass die maximal Argumentgröße nicht überschritten wird
Dann kann man auf xargs ausweichen... printf "%s\0" *.php */*.php */*/*.php | xargs -0 sed ... (printf ist als shell builtin nicht von den Argumentgrenzen betroffen)
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
seahawk1986 schrieb:
Mit find dürfte das aber flotter gehen, gerade wenn es da noch das Kriterium gibt, dass nur Dateien gefunden werden sollen:
Das ist auch meine generelle Erfahrung, find arbeitet schneller. frostschutz schrieb:
Dann kann man auf xargs ausweichen... printf "%s\0" *.php */*.php */*/*.php | xargs -0 sed ...
Nicht die Option "-r" von xargs vergessen!
|
Hefeweiz3n
Moderator, Webteam
Anmeldungsdatum: 15. Juli 2006
Beiträge: 5813
Wohnort: Ankh-Morpork
|
Da es anscheinend noch keinem aufgefallen ist: Wie wäre es einfach sed einfach erstmal ohne die Option -i laufen zu lassen und die Ausgabe auf Korrektheit zu prüfen. Alternativ bei mehreren Dateien auch per redirect in temp-dateien. Nur mal so.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
Hefeweiz3n schrieb: Da es anscheinend noch keinem aufgefallen ist: [...]
Mir fällt auf, dass derjenige, der dieses Skript "braucht" sich nach seinem Eingangsposting nicht wieder gemeldet hat.
|