Ich versuche, eine im Quellcode von HTML-/CSS-Dateien im Zielordner und in Unterordnern vorhandene URL zu suchen und zu ersetzen. Ich habe versucht, den folgenden Befehl zu verwenden:
find . -type f | xargs sed -i 's/https\:*\.websitedomain\.fr\///g'
Was fehlt mir?
Vielen Dank im Voraus für jeden Rat
Antwort1
Gehen wir von einem GNU-System aus (was Ihrer Verwendung von sed -i
nach auf Sie zutrifft):
eregex='https://[^/[:space:]]+\.websitedomain\.fr/'
find . -type f -exec grep -lZEe "$eregex" {} + |
xargs -r0 sed -i -E "s|$eregex||g"
Einige der Probleme Ihres Ansatzes:
- der wichtigste besteht darin, dass der
*
Regex-Operator mit 0 oder mehr des vorherigen Atoms übereinstimmt, also:*
mit 0 oder mehr:
s. Hier ersetzen wir es durch „[^/[:space:]]+
which is 1 or more (+
, ein erweiterter Regex-Operator, daher das-E
s)“-Zeichen außer Leerzeichen und/
(.*
was Sie wahrscheinlich im Sinn hatten, könnte beispielsweise mit übereinstimmen)google.com/ and foo
.https://google.com/ and foo.websitedomain.fr/file
- Das Ausgabeformat von
find -print
(ein Dateipfad pro Zeile) ist nicht mit dem erwarteten Eingabeformat von kompatibelxargs
(erwartet leere oder durch Zeilenumbrüche getrennte, möglicherweise durch Anführungszeichen gekennzeichnete Wörter). Das Ausgabeformat vonfind -print
ist nicht zuverlässig nachbearbeitbar und sollte nur für den menschlichen Gebrauch verwendet werden. Verwenden Sie besserfind ... -exec cmd {} +
und/oder NUL-getrennte Datensätze mitxargs -r0
(-r
und-0
als GNU-Erweiterungen). sed -i
ersetzt die Dateien durch eine geänderte Kopie des Originals, wobei möglicherweise Metadateninformationen verloren gehen. Daher sollte die Ausführung auf Dateien, die nicht geändert werden, vermieden werden. Verwenden Sie daher oder ,grep -lZ
um eine Liste (mit NUL getrennt,-Z
damit sie von verwendet werden kannxargs -0
) von Dateien mit mindestens einer Zeile zu erhalten, die mit dem regulären Ausdruck übereinstimmt.:
ist kein Regexp-Operator und muss daher nicht maskiert werden. Was\:
passt, ist von POSIX nicht spezifiziert und in den meistensed
Implementierungen nicht dokumentiert. Während es also derzeit:
in Ihrersed
Implementierung auf ein passen kann, kann sich das in Zukunft ändern (wie\<
oder\w
während es ursprünglich auf<
bzw.w
auf eine Wortgrenze und ein Wortzeichen in neueren Versionen passte).- Wenn Ihr regulärer Ausdruck oder Ihr Ersatz im
sed
Befehls
ein enthält/
, ist es einfacher, ein anderes Zeichen als Trennzeichen zu verwenden, als/
mit Backslashs zu maskieren, was das Lesen ziemlich erschwert. Dahers|regexp|replacement|g
hier statts/regexp/replacement/g
. Mir gefällt es , da es für lesbaren Code sorgt. Es hat jedoch den Nachteil, dass es nicht in /|
verwendet werden kann, da es dort Befehle trennt (es ist auch ein erweiterter regulärer Ausdrucksoperator).ex
vi
s/regex/replacement/
|
ex
Antwort2
Versuche dies:
find . -type f | xargs sed -i 's/test\.com/set\.com/g'
Wenn Sie die Einbeziehung vonhttpsdann versuche Folgendes:
find . -type f | xargs sed -i 's/https\:\\\\test\.com/https\:\\\\set\.com/g'
HINWEIS*: Dies ersetzttest.commitwww.set.com