出力したいhello world
20文字を超えています。
printf "%-20s :\n\n" 'hello world!!'
# Actual output
hello world!! :
# Wanted output
hello world!!========:
ただし、スペースではなく "="で補完する必要があります。それ、どうやったら出来るの?
より一般的な解決策となるように回答を更新しました。参照 以下の私の別の答え シェルブレース展開とpritnf
のみを使用してください。
_$ str='Hello World!'
$ sed -r ':loop; s/ (=*):$/\1=:/; t loop' <<< "$(printf '%-20s:\n' "$str" )"
Hello World!========:
_
どのように機能しますか?
この_(=*):$/
_は、入力の最後にコロン_=
_が後に続く1つのスペース、1つ以上の_:
_をキャプチャします。 _=
_のセットをグループマッチとして作成すると、_\1
_がその後方参照になります。
_:loop
_でloop
という名前のラベルを定義し、_t loop
_でs/ (=*):$/\1=:/
が正常に置換されたときにそのラベルにジャンプします。
_\1=:
_での置換部分では、常に_=
_ sの数を増やし、コロン自体を文字列の最後に戻します。
filler='===================='
string='foo'
printf '%s\n' "$string${filler:${#string}}"
与える
foo=================
${#string}
は値$string
の長さであり、${filler:${#string}}
はオフセット$filler
以降の${#string}
のサブストリングです。
出力の合計幅は、$filler
または$string
の最大幅になります。
フィラー文字列は、jot
があるシステムでは、次を使用して動的に作成できます
filler=$( jot -s '' -c 16 '=' '=' )
(16 =
の場合)。 GNUシステムはseq
を使用できます:
filler=$( seq -s '=' 1 16 | tr -dc '=' )
他のシステムでは、Perlまたは文字列を動的に作成する他の高速な方法を使用する場合があります。
printf "%.20s:\n\n" "$str========================="
どこ %.20s
は文字列の切り捨て形式です
それを行う1つの方法:
printf "====================:\r%s\n\n" 'hello world!!'
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"'
シェルで同じアイデア:
v='hello world!!'; while [ ${#v} -lt 20 ]; do v="$v""="; done; printf '%s\n\n' "$v"