Com o GNU sed
$ sed ':a;N;$!{/\n$/!ba}; s/[[:blank:]]*\n[[:blank:]]*/ /g' textfile
Start of p1 continued p1 end of p1.
Start of p2 end of p2.
Start of p3 continued p3 even more p3 end of p3.
Como funciona
-
:a
Isso define o rótulo
a
-
N
Isso lê a próxima linha e a acrescenta, junto com um caractere de nova linha, à linha atual.
-
$!{/\n$/!ba}
Se (a) não estamos no final do arquivo e (b) a linha atual não está vazia, então pule (ramifique) de volta para o rótulo
a
-
s/[[:blank:]]*\n[[:blank:]]*/ /g'
Se chegarmos aqui, temos um parágrafo completo no espaço padrão. Procure por todos os caracteres de nova linha, opcionalmente precedidos ou seguidos por espaços em branco, e substitua-os por um espaço em branco.
Com o BSD / OSX sed
Experimente (não testado):
sed -e :a -e 'N;$!{/\n$/!ba' -e '}' -e 's/[[:blank:]]*\n[[:blank:]]*/ /g' textfile
Usando o awk
$ awk '{printf "%s ",$0} /^$/{print ""} END{print ""}' text
Start of p1 continued p1 end of p1.
Start of p2 end of p2.
Start of p3 continued p3 even more p3 end of p3.