O sed, que vem com o FreeBSD 11.2 p7, fornece:
$ seq 10 | sed 'N; l; D; p'
1$
2$
2$
3$
3$
4$
4$
5$
5$
6$
6$
7$
7$
8$
8$
9$
9$
10$
Enquanto gsed (GNU sed 4.7) fornece o mesmo script:
$ seq 10 | gsed 'N; l; D; p'
1\n2$
2\n3$
3\n4$
4\n5$
5\n6$
6\n7$
7\n8$
8\n9$
9\n10$
10
Como podemos explicar essa diferença de comportamento?
BSD
sed
, ao usarl
para gerar caracteres em um formato visualmente inequívoco, não gera novas linhas em um formato visualmente inequívoco.De sed(1) no OpenBSD:
(note a falta de menção de novas linhas).
GNU
sed
, no entanto, inclui novas linhas no conjunto de caracteres para exibir sem ambiguidade. Ele faz isso como uma extensão ao conjunto de caracteres que o padrão POSIXsed
menciona (que é o conjunto que o BSDsed
usa). O GNUsed
se comporta dessa maneira mesmo se--posix
for usado na linha de comando.O GNU
sed
também produz10
duas vezes, enquanto o BSDsed
não. A execução do GNUsed
comPOSIXLY_CORRECT
set ou with--posix
fará com que ele saia10
apenas uma vez, como o BSDsed
faz.Isso ocorre porque o GNU
sed
por padrão ignora a parte da definição POSIX dosed
N
comando que dizObserve também que o
p
no seused
programa nunca é executado, poisD
inicia um novo ciclo.