O problema é que você tem um \n
em seu primeiro printf
. Isso faz com que o cursor se mova para a próxima linha, então quando você imprime o novo texto não está na mesma linha para sobrescrever o texto antigo. Se você remover isso, você deve ser bom:
COLUMNS=$(tput cols)
printf "%*s\r" $((COLUMNS/2)) "Hey, welcome to my script!"
sleep 2
printf "%*s" $((COLUMNS/2)) "This is a new line!"
printf "\n"
Eu consertei sua observação correta sobre o \r
estar errado e simplifiquei um pouco a matemática. Então eu adicionei um último \n
para colocar o prompt em sua própria linha no final