Se esses caracteres forem todos de byte único, isto é, se você estiver em um local onde o conjunto de caracteres é de byte único (como iso8859-1) ou se o conjunto de caracteres do locale for UTF-8, mas o texto for somente ASCII, você pode fazer:
printf -v y %-40.40s "$y"
Isso cobrirá tanto o truncamento quanto o preenchimento.
Se não, você sempre pode adicionar 40 espaços e usar sua abordagem ${y:0:40}
.
printf -v pad %40s
y=$y$pad
y=${y:0:40}
zsh
tem operadores dedicados para preenchimento à esquerda e à direita:
y=${(r:40:)y}
(também faz truncamento). zsh
printf
conta em caracteres em vez de bytes, por isso não teria o problema de bash
acima. No entanto, observe que você precisa de zsh
5.3 ou mais recente para a opção -v
.
Veja também esta resposta a uma questão relacionada para obter mais detalhes se você se deparar com caracteres que não têm a mesma largura.