O motivo pelo qual o sed falhou é que, a menos que você especifique um operador de várias linhas, ele opera no fluxo uma linha por vez. Início múltiplo da linha ^ e fim da linha $ operadores são sem sentido quando ligados juntos, se você está apenas olhando para o texto uma linha de cada vez.
A maneira mais fácil de recolher várias linhas em branco é com cat . Na página do manual:
-s, --squeeze-blank
suppress repeated empty output lines
Funciona assim:
$ echo -e "hello\n\n\nworld" | cat -s
hello
world
Se você quiser remover as linhas em branco inteiramente, em vez de compactá-las, use grep :
$ echo -e "hello\n\n\nworld" | grep -v '^$'
hello
world
Observe que, se você realmente quiser fazer isso em sed , precisará usar expressões e ações complicadas. Aqui está um exemplo (graças a fred ) que recolhe qualquer número de espaços em branco sequenciais em uma única linha em branco:
$ echo -e "hello\n\n\nworld" | sed -re '$!N;/^\n$/!P;D'
hello
world
Você pode ver porque o cat -s é muito mais fácil se o recolhimento de várias linhas em branco for tudo o que você procura!