Если все эти символы являются однобайтовыми, то есть если вы находитесь в локали, в которой кодировка является однобайтовой (например, iso8859-1), или если кодировка локали UTF-8, но текст только ASCII, вы можете сделать :
printf -v y %-40.40s "$y"
Это будет охватывать как усечение, так и заполнение.
Если нет, вы всегда можете добавить 40 пробелов и использовать свой ${y:0:40}
подход.
printf -v pad %40s
y=$y$pad
y=${y:0:40}
zsh
имеет специальные операторы для левого и правого заполнения:
y=${(r:40:)y}
(также делает усечение). zsh
«S printf
подсчитывает в символах вместо байт, так что не будет иметь bash
» проблемы с выше. Однако обратите внимание, что вам нужно zsh
5.3 или более поздней версии для этой -v
опции.
См. Также этот ответ на связанный вопрос для получения дополнительной информации, если вы столкнулись с символами, которые не имеют одинаковую ширину.