出力したい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}
offsetで始まる部分文字列、$string
valueの長さ。${filler:${#string}}
$filler
${#string}
出力の全幅はまたはの最$filler
大幅になります$string
。
jot
以下を含むシステムの場合
filler=$( jot -s '' -c 16 '=' '=' )
(=
1行あたり16個)。 GNUシステムは次のものを使用できますseq
。
filler=$( seq -s '=' 1 16 | tr -dc '=' )
他のシステムでは、Perlまたは動的に文字列を生成する他のより高速な方法を使用できます。
答え2
printf "%.20s:\n\n" "$str========================="
%.20s
文字列切り捨て形式はどこにありますか?
答え3
1つの方法は次のとおりです。
printf "====================:\r%s\n\n" 'hello world!!'
答え4
パール方法:
$ 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"'
シェルでも同じアイデア:
v='hello world!!'; while [ ${#v} -lt 20 ]; do v="$v""="; done; printf '%s\n\n' "$v"