Resposta atualizada para ser uma solução mais geral. veja também minha outra resposta abaixo usando apenas a expansão de chave de concha e pritnf .
$ str='Hello World!'
$ sed -r ':loop; s/ (=*):$/=:/; t loop' <<< "$(printf '%-20s:\n' "$str" )"
Hello World!========:
Como funciona?
este (=*):$/ captura um espaço, um ou mais = que é seguido por dois pontos : no final de sua entrada; nós fazemos o conjunto de = como uma correspondência de grupo e será sua referência de volta.
Com :loop , definimos um rótulo denominado loop e, com t loop , ele passa para esse rótulo quando um s/ (=*):$/=:/ fez uma substituição bem-sucedida;
Na peça de substituição com =: , ele sempre aumentará o número de = s e retornará o próprio ponto até o final da string.