A maneira típica de fazer isso não é apagar um único caractere, mas voltar ao início da linha usando um retorno de carro ( \r ):
printf "89%%"; sleep 1; printf "\r90%%\n"
Observe que isso não limpa a linha, então você precisa cuidar disso, se necessário. Opções simples estão adicionando espaços ao final, ou fazendo a largura fixa da saída (por exemplo, printf "%2d%%\n" 1 fornece um espaço à esquerda).
Existem saídas de terminal que permitem mover e limpar partes da tela, as seqüências CSI , mas eles são dependentes do terminal (embora na prática os escopos VT100 sejam suportados em todos os lugares agora). Por exemplo
printf "89%%"; sleep 1; printf "\e[3D90%%\n"
usa ␛[3D para mover três caracteres para a esquerda e escreve sobre eles (assumindo que printf suporta \e );
printf "89%% hello"; sleep 1; printf "\e[0E\e[K90%%\n"
usa ␛[0E para passar para o início da linha atual e ␛[K para limpar até o final da linha (supondo que seu terminal suporte essas sequências).
tput fornece uma maneira de terminal e printf de acessando estas seqüências:
printf "89%%"; sleep 1; tput cub 3; tput el; printf "90%%\n"
moverá o cursor para a esquerda três vezes ( cub 3 ) e passará para o final da linha ( el ), usando qualquer sequência de caracteres apropriada para o terminal atual;
printf "89%% hello"; sleep 1; tput hpa 0; tput el; printf "90%%\n"
moverá o cursor para a coluna mais à esquerda ( hpa 0 ) e passará para o final da linha.
man terminfo dirá o que é "nome do recurso" para usar com tput .
(Observe que muitas das especificidades dos exemplos acima presumem que todas as suas saídas estão na mesma linha. Elas não devem ser à prova de erros, apenas para ilustrar várias abordagens.)
Para um controle de tela similar em scripts PHP, você pode olhar para a extensão ncurses do PECL.