Für den Mac wäre ein ähnlicherer Ansatz dieser:
find . -name '*.txt' -print0 | xargs -0 sed -i "" "s/form/forms/g"
Als alternative Lösung verwende ich diese auf Mac OSX 10.7.5
grep -ilr 'old-word' * | xargs [email protected] sed -i '' 's/old-word/new-word/g' @
Dank geht an:Antwort von Todd Cesere
OS X verwendet eine Mischung aus BSD- und GNU-Tools, also überprüfen Sie am besten immer die Dokumentation (obwohl ich es hatte, dass less
nicht einmal der OS X-Manpage entspricht):
https://web.archive.org/web/20170808213955/https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/sed.1.html
sed nimmt das Argument nach -i
als Erweiterung für Backups. Geben Sie eine leere Zeichenfolge an (-i ''
) für keine Sicherungen.
Folgendes sollte reichen:
find . -type f -name '*.txt' -exec sed -i '' s/this/that/g {} +
Die -type f
ist nur gute Praxis; sed wird sich beschweren, wenn Sie ihm ein Verzeichnis oder so geben.
-exec
wird gegenüber xargs
bevorzugt; Sie brauchen sich nicht um -print0
zu kümmern oder so.
Die {} +
am Ende bedeutet, dass find
fügt alle Ergebnisse als Argumente an eine Instanz des aufgerufenen Befehls an, anstatt ihn für jedes Ergebnis erneut auszuführen. (Eine Ausnahme ist, wenn die vom Betriebssystem zugelassene maximale Anzahl von Befehlszeilenargumenten überschritten wird; in diesem Fall find
wird mehr als eine Instanz ausführen.)
Wenn Sie eine Fehlermeldung wie „ungültige Bytefolge“ erhalten, kann es hilfreich sein, das Standardgebietsschema zu erzwingen, indem Sie LC_ALL=C
hinzufügen am Anfang des Befehls, etwa so:
LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/g {} +