Bash 添加尾随空格以对齐字符串

use*_*977 30 bash

我当前的代码如下所示:x=${y:0:40},它将字符串的长度限制为 40 个字符。如果字符串短于 40 个字符,是否可以用空格填充尾随位置?

所以如果我的 y="very short text"

我希望我y是:

y="非常短的文本(+25 个尾随空格) "

Sté*_*las 29

如果这些字符都是单字节的,也就是说,如果您处于字符集为单字节(如 iso8859-1)的区域设置中,或者区域设置的字符集为 UTF-8 但文本仅为 ASCII,则您可以这样做:

printf -v y %-40.40s "$y"
Run Code Online (Sandbox Code Playgroud)

这将涵盖截断和填充。

如果没有,您始终可以添加 40 个空格并使用您的${y:0:40}方法。

printf -v pad %40s
y=$y$pad
y=${y:0:40}
Run Code Online (Sandbox Code Playgroud)

zsh 具有用于左右填充的专用运算符:

y=${(r:40:)y}
Run Code Online (Sandbox Code Playgroud)

(也做截断)。zsh'sprintf以字符数而不是字节数计数(或者如果还使用m参数扩展标志,则基于字符的显示宽度),所以不会有bash上面的 's 问题。但是请注意,zsh-v选项需要5.3 或更高版本。

如果您遇到的字符宽度不同,另请参阅相关问题的答案以获取更多详细信息。


小智 27

你应该尝试printf

printf '%-40s' "$y"
Run Code Online (Sandbox Code Playgroud)

  • 我将其用于数值,如下所示:获得长度为 5 的 0-left 填充 ```printf '%5.5d'``` 。对于 230,它打印“00230” (2认同)

agc*_*agc 13

bash:

ten="          " 
forty="$ten$ten$ten$ten" 
y="very short text"
y="${y:0:40}${forty:0:$((40 - ${#y}))}"
echo "'${y}'"
Run Code Online (Sandbox Code Playgroud)

方法是在每个字符串截断后添加0-40个空格。

输出,(注意单引号位置):

'very short text                         '
Run Code Online (Sandbox Code Playgroud)