Suchen und Ersetzen mit find und xargs funktioniert nicht

Suchen und Ersetzen mit find und xargs funktioniert nicht

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 -inach 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 -Es)“-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 kompatibel xargs(erwartet leere oder durch Zeilenumbrüche getrennte, möglicherweise durch Anführungszeichen gekennzeichnete Wörter). Das Ausgabeformat von find -printist nicht zuverlässig nachbearbeitbar und sollte nur für den menschlichen Gebrauch verwendet werden. Verwenden Sie besser find ... -exec cmd {} +und/oder NUL-getrennte Datensätze mit xargs -r0( -rund -0als GNU-Erweiterungen).
  • sed -iersetzt 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 -lZum eine Liste (mit NUL getrennt, -Zdamit sie von verwendet werden kann xargs -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 meisten sedImplementierungen nicht dokumentiert. Während es also derzeit :in Ihrer sedImplementierung auf ein passen kann, kann sich das in Zukunft ändern (wie \<oder \wwährend es ursprünglich auf <bzw. wauf eine Wortgrenze und ein Wortzeichen in neueren Versionen passte).
  • Wenn Ihr regulärer Ausdruck oder Ihr Ersatz im sedBefehl sein enthält /, ist es einfacher, ein anderes Zeichen als Trennzeichen zu verwenden, als /mit Backslashs zu maskieren, was das Lesen ziemlich erschwert. Daher s|regexp|replacement|ghier statt s/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).exvis/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

verwandte Informationen