我想输出hello world
超过20个字符。
printf "%-20s :\n\n" 'hello world!!'
# Actual output
hello world!! :
# Wanted output
hello world!!========:
但是,我不想用空格来完成,而是用“=“相反。我该怎么做呢?
答案1
filler='===================='
string='foo'
printf '%s\n' "$string${filler:${#string}}"
给予
foo=================
${#string}
是 value 的长度$string
,是从 offset 开始${filler:${#string}}
的子字符串。$filler
${#string}
输出的总宽度将是$filler
或的最大宽度$string
。
jot
在具有 的系统上,可以使用动态创建填充字符串
filler=$( jot -s '' -c 16 '=' '=' )
(=
一行 16 个)。 GNU 系统可以使用seq
:
filler=$( seq -s '=' 1 16 | tr -dc '=' )
其他系统可能使用 Perl 或其他一些更快的动态创建字符串的方法。
答案2
printf "%.20s:\n\n" "$str========================="
哪里%.20s
是字符串截断格式
答案3
一种方法是:
printf "====================:\r%s\n\n" 'hello world!!'
答案4
Perl 方法:
$ perl -le '$k="hello world!!"; while(length($k)<20){$k.="=";} print "$k\n"'
hello world!!=======
或者,更好的是,@SatoKatsura 在评论中指出:
perl -le '$k = "hello world!!"; print $k, "=" x (20-length $k), "\n"'
如果需要支持UTF多字节字符,请使用:
PERL_UNICODE='AS' perl -le '$k = "hello world!!"; print $k, "=" x (20-length $k), "\n"'
shell 中的想法相同:
v='hello world!!'; while [ ${#v} -lt 20 ]; do v="$v""="; done; printf '%s\n\n' "$v"