Rekursives Suchen und Ersetzen mit sed mit URLs

Rekursives Suchen und Ersetzen mit sed mit URLs

Ich habe eine große Anzahl von Dateien, in denen ich ein vollständiges URL-Schema ersetzen muss. Einige Dateinamen enthalten Leerzeichen. Nach langem Suchen und Versuchen und Irren bin ich am nächsten gekommen:

find /somedir -type f -print0 -exec sed -i'' -e 's#http\\:\\/\\/domain.com#https\\:\\/\\/www.domain.com#g' {} +

Aus der resultierenden Datei wird das Schema http:entfernt, übrig bleibt //- ie '//www.domain.com'

Zusätzlich wird eine NEUE Datei erstellt, die -ean den Dateinamen angehängt wird. – some file.php-ewas offensichtlich unerwünscht ist.

Obwohl dies sicherlich ausreichen würde (nachdem die *-eDateien entfernt wurden), möchte der Zwangsneurotiker in mir unbedingt wissen, wie man dies richtig macht. Hinweis: Ich arbeite lokal auf einem Mac, werde dies aber auch unter Linux durchführen.

Alle Ideen sind sehr willkommen!

Antwort1

Lösung 1: Eine Möglichkeit ist die Verwendung findmit xargs:

find /dir -type f -print0 | xargs -0 sed -i 's#http://domain.com#https://www.domain.com#g'

Lösung 2: Eine andere Möglichkeit wäre die Verwendung findmit -exec, ganz ähnlich wie in Ihrer Frage:

find /dir -type f -exec sed -i 's#http://domain.com#https://www.domain.com#g' {} +

sedBeide Lösungen werden mit mehreren Dateien als Argumenten aufgerufen . sedSie werden also nicht einmal für jede Datei aufgerufen, sondern für jeden Satz von Dateien.

Lösung 3: Statt könnte man für den Suchen-Ersetzen-Job sedauch verwenden :perl

perl -i -pe 's#http://domain.com#https://www.domain.com#g' file

Kombiniert mit dem find/ xargs-Befehl:

find /dir -type f -print0 | xargs -0 perl -i -pe 's#http://domain.com#https://www.domain.com#g'

verwandte Informationen