Aqui está um one-liner perl para enviar seu generate_output para:
perl -e '$/ = "\r"; $| = 1; while(<STDIN>){s/ foo//;print;}'
$/
define o delimitador de linha de entrada e $|
torna a saída sem buffer.
Estou com problemas para editar alguma saída de progresso. Nesse caso, é o pg_basebackup
do Postgres, mas é semelhante a outras saídas de progresso, como curl e wget. Tomemos por exemplo a saída disso:
generate_output() {
for f in {1..500}; do
sleep 0.01
echo -ne "Downloading... $f/500 foo \r"
done
echo -e "\nSome final line 1\nSome final line 2"
}
Que tem saída como esta
Downloading... 1/500 foo
(...same line...)
Downloading... 500/500 foo
Some final line 1
Some final line 2
Como eu poderia remover o "foo" dessa saída, mantendo a natureza de progresso? (em vez de ser armazenado em buffer e, portanto, inútil)
Eu tentei tanto o awk
quanto o sed
, mas ambos parecem depender muito do buffer de linha, e não há nenhuma nova linha na saída Downloading...
até que esteja completamente terminada.
O mais próximo que obtive é um hack que primeiro substitui CR
por LF
, depois o substitui novamente depois. Mas isso estraga as novas linhas reais (por exemplo, "Alguma linha final 1")
generate_output | stdbuf -i0 -o0 tr $'\r' $'\n' | sed -u -e 's/ foo//' | stdbuf -i0 -o0 tr $'\n' $'\r'
Existe uma maneira de configurar awk
ou sed
para lidar com isso? Ou uma ferramenta melhor para o trabalho?
Notas:
42318/42318 kB (100%), 1/1 tablespace
e gostaria de cortar tudo, incluindo e depois da vírgula. Aqui está uma solução bash para enviar seu generate_output
para:
#!/bin/bash
while read -d $'\r' line
do echo -ne "${line% foo}\r"
done
echo "$line"
Tags perl awk sed shell-script string