Pure Bash, tidak ada utilitas eksternal
Demonstrasi ini melakukan justifikasi penuh, tetapi Anda bisa menghilangkan pengurangan panjang string kedua jika Anda menginginkan garis yang tidak rata.
pad=$(printf '%0.1s' "-"{1..60})
padlength=40
string2='bbbbbbb'
for string1 in a aa aaaa aaaaaaaa
do
printf '%s' "$string1"
printf '%*.*s' 0 $((padlength - ${#string1} - ${#string2} )) "$pad"
printf '%s\n' "$string2"
string2=${string2:1}
done
Sayangnya, dalam teknik itu, panjang string pad harus di-hardcode agar lebih panjang dari yang terpanjang yang Anda pikir Anda perlukan, tetapi padlength bisa menjadi variabel seperti yang ditunjukkan. Namun, Anda dapat mengganti baris pertama dengan ketiga baris ini agar dapat menggunakan variabel untuk panjang bantalan:
padlimit=60
pad=$(printf '%*s' "$padlimit")
pad=${pad// /-}
Jadi pad ( padlimit
dan padlength
) bisa didasarkan pada lebar terminal ( $COLUMNS
) atau dihitung dari panjang string data terpanjang.
Keluaran:
a--------------------------------bbbbbbb
aa--------------------------------bbbbbb
aaaa-------------------------------bbbbb
aaaaaaaa----------------------------bbbb
Tanpa mengurangi panjang senar kedua:
a---------------------------------------bbbbbbb
aa--------------------------------------bbbbbb
aaaa------------------------------------bbbbb
aaaaaaaa--------------------------------bbbb
Baris pertama malah bisa sama (mirip dengan sprintf
):
printf -v pad '%0.1s' "-"{1..60}
atau serupa untuk teknik yang lebih dinamis:
printf -v pad '%*s' "$padlimit"
Anda dapat melakukan pencetakan semua dalam satu baris jika Anda mau:
printf '%s%*.*s%s\n' "$string1" 0 $((padlength - ${#string1} - ${#string2} )) "$pad" "$string2"