Bash добавить завершающие пробелы для выравнивания строки

20

Мой текущий код выглядит так:, x=${y:0:40}который ограничивает длину строки до 40 символов. Если строка длиной менее 40 символов, можно ли заполнить пробелы?

Так что если мой y="very short text"

Я хотел бы, чтобы мой у был:

y = "очень короткий текст (+25 пробелов) "

user222977
источник

Ответы:

20

Если все эти символы являются однобайтовыми, то есть если вы находитесь в локали, в которой кодировка является однобайтовой (например, 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» проблемы с выше. Однако обратите внимание, что вам нужно zsh5.3 или более поздней версии для этой -vопции.

См. Также этот ответ на связанный вопрос для получения дополнительной информации, если вы столкнулись с символами, которые не имеют одинаковую ширину.

Стефан Шазелас
источник
14

Вы должны попробовать printf:

printf '%-40s' "$y"

источник
10

Чистый 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                         '
АРУ
источник
1
Я бы предпочел использовать этот метод, потому что он будет работать непосредственно с переменными и не нужно выводить.
Дэвид Табернеро М.