perl
tem um modo de parágrafo por meio da sinalização -00
perlrun
, por isso, se substituirmos todas as novas linhas internas do seu input
por um espaço:
$ wc -l input
7 input
$ perl -00 -pe 's/\n(?!\Z)/ /g' input | wc -l
3
$
O (?!\Z)
bit não substitui as novas linhas no final de cada parágrafo, preservando assim os limites de parágrafo.
Outra opção é lex
. Isso revela alguns pontos complicados, como manipular EOF
e incluir sempre uma nova linha final (como exige o POSIX) e o que você define como um parágrafo: exatamente duas novas linhas ou qualquer número?
%%
[\n][\n]+ { printf("%s", yytext); }
\n { int c = input();
/* TODO book docs say this should return EOF on EOF ?? */
if (c == 0) {
putchar('\n');
yyterminate();
} else {
printf(" %c", c);
}
}
<<EOF>> { putchar('\n'); yyterminate(); }
%%
int main(int argc, char *argv[])
{
return yylex();
}
Provavelmente precisa de mais testes do que
$ make paranlneg
lex -o lex.paranlneg.c paranlneg.l
egcc -O2 -pipe -o paranlneg lex.paranlneg.c -ll
rm -f lex.paranlneg.c
$ perl -E 'say "a\nb\n\nc\nd"' | ./paranlneg
a b
c d
$