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):
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 bevorzugt xargs
; Sie brauchen sich nicht darum zu kümmern -print0
oder so. Das {} +
am Ende bedeutet, dass find
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 Fall find
wird mehr als eine Instanz ausgeführt.)
%
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:
find . -name '*.txt' -print0 | xargs -0 sed -i "" "s/form/forms/g"
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
grep -ilr 'old-word' * | xargs -I@ sed -i '' 's/old-word/new-word/g' @
Gutschrift geht an: Todd Cesere Antwort
Unter Mac OS X 10.11.5 funktioniert dies einwandfrei:
grep -rli 'old-word' * | xargs -I@ sed -i '' 's/old-word/new-word/g' @
Keine der oben genannten Funktionen funktioniert unter OSX.
Mach Folgendes:
perl -pi -w -e 's/SEARCH_FOR/REPLACE_WITH/g;' *.txt
Eine Version, die sowohl unter Linux als auch unter Mac OS X funktioniert (durch Hinzufügen des -e
Schalters zu sed
):
export LC_CTYPE=C LANG=C
find . -name '*.txt' -print0 | xargs -0 sed -i -e 's/this/that/g'
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:
#!/bin/bash
#By Nate Flink
#Invoke on the terminal like this
#curl -s https://gist.github.com/nateflink/9056302/raw/findreplaceosx.sh | bash -s "find-a-url.com" "replace-a-url.com"
if [ -z "$1" ] || [ -z "$2" ]; then
echo "Usage: ./$0 [find string] [replace string]"
exit 1
fi
FIND=$1
REPLACE=$2
#needed for byte sequence error in ascii to utf conversion on OSX
export LC_CTYPE=C;
export LANG=C;
#sed -i "" is needed by the osx version of sed (instead of sed -i)
find . -type f -exec sed -i "" "s|${FIND}|${REPLACE}|g" {} +
exit 0
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.
find . -type f -name '*.txt' -exec sed -i '' s/thistext/newtext/ {} +
g
, da Ihr sed regex am Ende a benötigt, andernfalls ersetzt er nur das erste Vorkommen thistext
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:
$ ls test
a d d2 z
$ cat test/z
hi
$ ./serp --root test --search hi --replace bye --pattern "*"
test/z: replace hi with bye? (y/[n]) y
$ cat test/z
bye
find . -type f | xargs sed -i '' 's/string1/string2/g'
Weitere Informationen finden Sie hier .
Der Befehl unter OSX sollte genau der gleiche sein wie Unix unter der hübschen Benutzeroberfläche.
-print0
den find
Flags und -0
den xargs
Flags hinzugefügt werden .
-exec sed -i s/this/that/g {} \+
anstelle von -print
und xargs verwenden
xargs
möglicherweise das durch Leerzeichen getrennte "./jacobus" als Datei angezeigt, an die übergeben werden soll sed
, und dann mit "R.txt". , von denen keines existiert.
könnte einfach $ PWD anstelle von "." sagen.
apple.stackexchange.com
da es weder für Linux noch für alle Entwickler generisch genug ist.