Вы должны попробовать printf
:
printf '%-40s' "$y"
Если все эти символы однобайтовые, то есть если вы находитесь в локали, где кодировка однобайтовая (например, 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
printf
считает символы, а не байты, поэтому не будет проблемы с bash
выше. Однако обратите внимание, что для опции -v
вам потребуется zsh
5.3 или новее.
См. также этот ответ на связанный вопрос для получения более подробной информации, если вы столкнулись с символами, которые не имеют одинаковой ширины.
Чистый bash
:
ten=" "
forty="$ten$ten$ten$ten"
y="very short text"
y="${y:0:40}${forty:0:$((40 - ${#y}))}"
echo "'${y}'"
Метод заключается в добавлении 0-40 пробелов к каждой строке после ее усечения.
Вывод (обратите внимание на одинарные кавычки):
'very short text '