OS X в настоящее время поставляется с операционной системой FreeBSD 2005 года. Большинство различий ниже также применимы к другим версиям BSD sed.
OS X использует sed -E
для ERE и GNU sed использует -r
. -E
псевдоним для -r
в GNU sed (добавлено в 4.2, не документировано до 4.3). Более новые версии FreeBSD и NetBSD sed поддерживают -E
и -r
. OpenBSD sed поддерживает только -E
.
-i ''
работает с OS X sed, но не GNU sed. -i
работает с GNU sed, последними версиями NetBSD, OpenBSD sed
, но не с OS X sed. -i -e
работает с обоими, но в случае FreeBSD sed
делает резервную копию исходного файла с -e
добавлением к имени файла (и вам нужно передать не более одного выражения sed
).
GNU SED интерпретирует управляющие последовательности , как \t
, \n
, \001
, \x01
, \w
, и \b
. OS X и POSIX sed только интерпретируют \n
(но не в замене s
).
GNU sed интерпретирует \|
, \+
и \?
в BRE, но OS X sed и POSIX sed не делают. \(
, \)
, \{
, И \}
являются POSIX BRE.
GNU sed позволяет пропустить ;
или новую строку раньше, }
а OS X - нет.
i
(вставка), a
(добавление) и c
(изменение) должны сопровождаться обратной косой чертой и новой строкой в OSD sed и POSIX sed, но не в GNU sed. GNU СЭД добавляет недостающий символ новой строки после текста , вставленный i
, a
или c
но OS X в SED не делает. Например, sed 1ia
GNU альтернатива sed $'1i\\\na\n'
.
Например, printf a|sed -n p
добавляет новую строку в OS X sed, но не в GNU sed.
OS X sed не поддерживает I
(без учета регистра) или M
(многострочные) модификаторы. Более новые версии поддержки FreeBSD sed I
.
OS X sed не поддерживает -s
( --separate
), -u
( --unbuffered
) или -z
( --null-data
).
Одна из опций BSD, которая не поддерживается GNU sed -a
, заключается в w
добавлении файла вместо его усечения.
Примеры команд GNU sed, которые не работают с sed OS X:
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
Сам GNU является совместимым, поскольку он делает вещи, разрешенные (но не обязательные, неуказанные) стандартом. Бывают случаи, когда он не соответствует требованиям, и его использованиеPOSIXLY_CORRECT
в среде может помочь. Как и в случае сs/[\n]//g
этим необходимо удалить обратную реакцию иn
символы, но вместо этого удалить символы новой строки. Или поведениеN
команды в последней строке.