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!