OS X wird derzeit mit einer FreeBSD-Version ab 2005 ausgeliefert. Die meisten der folgenden Unterschiede gelten auch für andere BSD-Versionen.
Die sed-Verwendungen von OS X -E
für ERE- und GNU-sed-Verwendungen -r
. -E
ist ein Alias für -r
in GNU sed (hinzugefügt in 4.2, nicht dokumentiert bis 4.3). Neuere Versionen von FreeBSD und NetBSD sed unterstützen sowohl -E
als auch -r
. OpenBSD sed unterstützt nur -E
.
-i ''
funktioniert mit OS X's sed aber nicht mit GNU sed. -i
funktioniert mit GNU sed, neueren Versionen von NetBSD, OpenBSD sed
, aber nicht mit OS X sed. -i -e
funktioniert mit beiden, aber im Falle von FreeBSD sed
wird eine Sicherungskopie der Originaldatei mit dem -e
angehängten Dateinamen erstellt (und Sie müssen nicht mehr als einen Ausdruck übergeben sed
).
GNU sed interpretiert Escape - Sequenzen wie \t
, \n
, \001
, \x01
, \w
, und \b
. OS X's sed und POSIX sed interpretieren nur \n
(aber nicht im Ersatzteil von s
).
GNU sed interpretiert \|
, \+
und \?
in BRE aber OS X sed und POSIX sed nicht. \(
, \)
, \{
, Und \}
sind POSIX BRE.
GNU sed erlaubt das Auslassen von ;
Zeilen oder eine neue Zeile }
, OS X's sed nicht.
i
(insert), a
(append) und c
(change) müssen in sed und POSIX sed von einem Backslash und einer Newline gefolgt werden, nicht jedoch in GNU sed. GNU sed eine fehlende Newline nach dem von eingefügten Text fügt hinzu i
, a
oder c
aber OS X sed ist nicht der Fall. Zum Beispiel sed 1ia
ist eine GNU-Alternative zu sed $'1i\\\na\n'
.
printf a|sed -n p
Fügt beispielsweise eine neue Zeile in OS Xs sed hinzu, jedoch nicht in GNU sed.
In OS X werden die Modifikatoren I
( ohne Berücksichtigung der Groß- und Kleinschreibung) oder M
(mit mehreren Zeilen) nicht unterstützt . Neuere Versionen von FreeBSD sed unterstützen I
.
Sed von OS X unterstützt -s
( --separate
), -u
( --unbuffered
) oder -z
( --null-data
) nicht.
Eine BSD-Option, die von GNU sed nicht unterstützt wird -a
, besteht darin , w
an eine Datei anzuhängen, anstatt eine Datei abzuschneiden.
Beispiele für GNU sed-Befehle, die mit sed von OS X nicht funktionieren:
sed /pattern/,+2d # like `sed '/pattern/{N;N;d;}'`
sed -n 0~3p # like `awk NR%3==0`
sed /pattern/Q # like `awk '/pattern/{exit}1'` or `sed -n '/pattern/,$!p'`
sed 's/\b./\u&/g' # \u converts the next character to uppercase
sed 's/^./\l&/' # \l converts the next character to lowercase
sed -i '1ecat file_to_prepend' file # e executes a shell command
sed -n l0 # 0 disables wrapping
sed
selbst ist konform, da es Dinge tut, die der Standard erlaubt (aber nicht erforderlich, nicht spezifiziert). Es gibt Fälle, in denen es nicht konform ist und in denen das AusführenPOSIXLY_CORRECT
in der Umgebung hilfreich sein kann. Wie beis/[\n]//g
diesem muss man den Backlash und dien
Zeichen entfernen, aber stattdessen die Newlines entfernen. Oder das Verhalten desN
Befehls in der letzten Zeile.