A questão principal é que sed
funciona em linhas para que não faça nada até que o primeiro \n
seja alcançado e isso não aconteça até que seu comando seja concluído. Você pode contornar isso trocando \r
s por \n
s:
$ curl --progress-bar http://127.0.0.1/test.tar.bz2 -o test.tar.bz2 2>&1 |
tr $'\r' $'\n' | sed -r 's/[# ]+/#/g;'
Isso, no entanto, mostra o buffer, sed
agora atuará em grupos de linhas. A solução final que eu juntei foi redirecionar o erro para um arquivo e então lidar com esse arquivo:
$ curl --progress-bar http://127.0.0.1/test.tar.bz2 -o test.tar.bz2 2>er
$ while :; do
echo -ne "$(tr $'\r' $'\n' < er | tail -n 1 | sed -r 's/^[# ]+/#/;')\r";
done
O comando acima analisará o arquivo de erro ( er
) e imprimirá o resultado com um \r
, atualizando-o constantemente. Você precisará sair disso manualmente.
Sugestão de um usuário anônimo: Você também pode colocar stdbuf -oL
na frente de tr
e sed
, modificando o comportamento do buffer desses comandos.