In der Linux-Shell sucht und ersetzt der folgende Befehl rekursiv alle Instanzen von 'this' durch 'that' (ich habe keine Linux-Shell vor mir, sollte es aber tun).
find . -name "*.txt" -print | xargs sed -i 's/this/that/g'
Wie sieht ein ähnlicher Befehl unter OSX aus?
apple.stackexchange.com
da es weder für Linux noch für alle Entwickler generisch genug ist.Antworten:
OS X verwendet eine Mischung aus BSD- und GNU-Tools. Überprüfen Sie daher am besten immer die Dokumentation (obwohl ich sie hatte,
less
die nicht einmal der OS X-Manpage entsprach):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 (-i ''
) für keine Sicherungen an.Folgendes sollte reichen:
LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +
Das
-type f
ist nur eine gute Praxis; sed wird sich beschweren, wenn Sie ihm ein Verzeichnis oder so geben.-exec
wird gegenüber bevorzugtxargs
; Sie brauchen sich nicht darum zu kümmern-print0
oder so. Das{} +
am Ende bedeutet, dassfind
alle Ergebnisse als Argumente an eine Instanz des aufgerufenen Befehls angehängt werden, anstatt sie für jedes Ergebnis erneut auszuführen. (Eine Ausnahme ist, wenn die vom Betriebssystem maximal zulässige Anzahl von Befehlszeilenargumenten verletzt wird. In diesem Fallfind
wird mehr als eine Instanz ausgeführt.)quelle
%
Zeichen verwenden :sed "s%localhost/site%blah/blah%"
. Eine andere Alternative besteht darin, das Trennzeichen rückwärts zu entfernen :sed "s/localhost\/site/blah\/blah/"
.illegal byte sequence
Fehler? Wenn ja, versuchen Sie es:LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +
Es hat bei mir funktioniert./g
für mehrere Währung wieLC_ALL=C find . -type f -exec sed -i '' s/search/replace/g {} +
Für den Mac wäre ein ähnlicher Ansatz folgender:
quelle
find . -name '*.php' -print0 | xargs -0 sed -i "" "s/easyform/form360/g"
Als alternative Lösung verwende ich diese unter Mac OSX 10.7.5
Gutschrift geht an: Todd Cesere Antwort
quelle
Unter Mac OS X 10.11.5 funktioniert dies einwandfrei:
quelle
Keine der oben genannten Funktionen funktioniert unter OSX.
Mach Folgendes:
quelle
Eine Version, die sowohl unter Linux als auch unter Mac OS X funktioniert (durch Hinzufügen des
-e
Schalters zused
):quelle
export LC_CTYPE=C && export LANG=C
Wenn ich diesen Befehl eingebe, scheine ich ihn immer abzuspritzen oder eine Flagge zu vergessen. Ich habe einen Gist auf Github basierend auf TaylanUBs Antwort erstellt, der einen globalen Fund aus dem aktuellen Verzeichnis ersetzt. Dies ist Mac OSX-spezifisch.
https://gist.github.com/nateflink/9056302
Es ist schön, weil ich jetzt einfach ein Terminal öffne und kopiere:
curl -s https://gist.github.com/nateflink/9056302/raw/findreplaceosx.sh | bash -s "find-a-url.com" "replace-a-url.com"
Sie können einige seltsame Byte-Sequenzfehler erhalten, daher hier der vollständige Code:
quelle
Dies ist meine praktikable. unter Mac OS X 10.10.4
Die oben genannten, die find verwenden , ändern die Dateien, die den Suchtext nicht enthalten (fügen Sie am Ende der Datei eine neue Zeile hinzu), was ausführlich ist.
quelle
Wenn Sie ein zsh-Terminal verwenden, können Sie Wildcard-Magie verwenden:
sed -i "" "s/search/high-replace/g" *.txt
quelle
Ich habe dieses Format verwendet - aber ... ich musste es mindestens drei Mal ausführen, damit es tatsächlich jede Instanz ändert, die ich als äußerst seltsam empfand. Wenn Sie es einmal ausführen, werden einige in jeder Datei geändert, aber nicht alle. Wenn Sie zwei- bis viermal genau dieselbe Zeichenfolge ausführen, werden alle Instanzen abgefangen.
quelle
g
, da Ihr sed regex am Ende a benötigt, andernfalls ersetzt er nur das erste Vorkommenthistext
in einer Zeile. Ihr Regex sollte also seins/thistext/newtext/g
https://bitbucket.org/masonicboom/serp ist ein unter OSX getestetes Dienstprogramm go (dh plattformübergreifend), das rekursives Suchen und Ersetzen von Text in Dateien in einem bestimmten Verzeichnis durchführt und jede Ersetzung bestätigt. Es ist neu, könnte also fehlerhaft sein.
Die Verwendung sieht aus wie:
quelle
Weitere Informationen finden Sie hier .
quelle
Der Befehl unter OSX sollte genau der gleiche sein wie Unix unter der hübschen Benutzeroberfläche.
quelle
-print0
denfind
Flags und-0
denxargs
Flags hinzugefügt werden .-exec sed -i s/this/that/g {} \+
anstelle von-print
und xargs verwendenxargs
möglicherweise das durch Leerzeichen getrennte "./jacobus" als Datei angezeigt, an die übergeben werden sollsed
, und dann mit "R.txt". , von denen keines existiert.könnte einfach $ PWD anstelle von "." sagen.
quelle