Se esses caracteres são todos de byte único, ou seja, se você estiver em um código de idioma em que o conjunto de caracteres é de byte único (como iso8859-1) ou se o conjunto de caracteres do código de idioma é UTF-8, mas o texto é apenas ASCII, você pode :
printf -v y %-40.40s "$y"
Isso abrangerá truncamento e preenchimento.
Caso contrário, você sempre pode adicionar 40 espaços e usar sua ${y:0:40}
abordagem.
printf -v pad %40s
y=$y$pad
y=${y:0:40}
zsh
possui operadores dedicados para preenchimento esquerdo e direito:
y=${(r:40:)y}
(também faz truncamento). zsh
's printf
contagens em caracteres em vez de bytes, por isso não teria bash
' s problema acima. No entanto, observe que você precisa da zsh
versão 5.3 ou mais recente para a -v
opção.
Consulte também esta resposta a uma pergunta relacionada para obter mais detalhes se você se deparar com caracteres que nem todos têm a mesma largura.