Atualmente, o OS X vem com um sed do FreeBSD a partir de 2005. A maioria das diferenças abaixo também se aplica a outras versões do sed do BSD.
Os usos sed do OS X -E
para usos sed ERE e GNU -r
. -E
é um alias para -r
no GNU sed (adicionado em 4.2, não documentado até 4.3). Versões mais recentes do FreeBSD e NetBSD sed suportam tanto -E
e -r
. O OpenBSD sed suporta apenas -E
.
-i ''
funciona com o sed do OS X, mas não o GNU sed. -i
trabalha com GNU sed, versões recentes do NetBSD, OpenBSD sed
, mas não do OS X sed. -i -e
funciona com ambos, mas no caso do FreeBSD sed
faz um backup do arquivo original -e
anexado ao nome do arquivo (e você não precisa passar mais que uma expressão sed
).
GNU interpreta sed sequências de escape como \t
, \n
, \001
, \x01
, \w
, e \b
. O sed do OS X e o POSIX sed interpretam apenas \n
(mas não na parte de substituição s
).
O GNU sed interpreta \|
, \+
e \?
no BRE, mas o sed do OS X e o POSIX sed não. \(
, \)
, \{
, E \}
são POSIX BRE.
O GNU sed permite omitir ;
ou uma nova linha antes, }
mas o sed do OS X não.
i
(insert), a
(append) e c
(change) devem ser seguidos por uma barra invertida e uma nova linha no sed do OS X e no POSIX sed, mas não no GNU sed. Sed GNU acrescenta uma nova linha faltando após o texto inserido por i
, a
ou c
mas OS X da sed não. Por exemplo, sed 1ia
é uma alternativa ao GNU sed $'1i\\\na\n'
.
Por exemplo, printf a|sed -n p
adiciona uma nova linha no sed do OS X, mas não no GNU sed.
O sed do OS X não suporta modificadores I
( que não diferenciam maiúsculas de minúsculas) ou M
(multilinhas). Versões mais recentes do suporte ao FreeBSD sed I
.
O sed do OS X não suporta -s
( --separate
), -u
( --unbuffered
) ou -z
( --null-data
).
Uma opção BSD que não é suportada pelo GNU sed é a -a
que w
anexa a um arquivo em vez de truncar um arquivo.
Exemplos de comandos GNU sed que não funcionam com o sed do 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
próprio GNU é compatível, pois faz as coisas permitidas (mas não exigidas, não especificadas) pelo padrão. Há casos em que não é compatível e onde a execuçãoPOSIXLY_CORRECT
no ambiente pode ajudar. Como coms/[\n]//g
isso, é necessário remover a folga e osn
caracteres, mas remover as novas linhas. Ou o comportamento doN
comando na última linha.