Como resposta vinculada do @ don_crissti mostra, a opção de colar faz bordas incrivelmente rápidas - a tubulação do kernel do Linux é mais eficiente do que eu teria acreditado se não tivesse tentado agora. Notavelmente, se você pode ser feliz com uma única vírgula separando seus itens de lista em vez de uma vírgula + espaço, um pipeline de pasta
(paste -d\' /dev/null - /dev/null | paste -sd, -) <input
é mais rápido do que um programa flex
razoável (!)
%option 8bit main fast
%%
.* { printf("'%s'",yytext); }
\n/(.|\n) { printf(", "); }
Mas se apenas o desempenho decente for aceitável (e se você não estiver executando um teste de estresse, não conseguirá medir as diferenças de fator de constante, eles são todos instantâneos) e você quer flexibilidade com seus separadores e razoável one-liner-y-ness,
sed "s/.*/'&'/;H;1h;"'$!d;x;s/\n/, /g'
é o seu bilhete. Sim, parece um ruído de linha, mas o idioma H;1h;$!d;x
é o jeito certo de aproveitar tudo, assim que você consegue reconhecer que a coisa toda fica fácil de ler, é s/.*/'&'/
seguido por um slurp e s/\n/, /g
.
edite: beirando o absurdo, é bastante fácil conseguir que o flex bata todo o resto, apenas diga ao stdio que você não precisa do sync multithread / signalhandler embutido:
%option 8bit main fast
%%
.+ { putchar_unlocked('\'');
fwrite_unlocked(yytext,yyleng,1,stdout);
putchar_unlocked('\''); }
\n/(.|\n) { fwrite_unlocked(", ",2,1,stdout); }
e sob estresse que é 2-3x mais rápido que os pipelines de pasta, que são eles próprios pelo menos 5x mais rápidos do que todo o resto.