Pure Bash, pas d'utilitaires externes
Cette démonstration fait une justification complète, mais vous pouvez simplement omettre de soustraire la longueur de la deuxième chaîne si vous voulez des lignes irrégulières.
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
Malheureusement, dans cette technique, la longueur de la chaîne de pad doit être codée en dur pour être plus longue que la plus longue dont vous pensez avoir besoin, mais la longueur de pad peut être une variable comme indiqué. Cependant, vous pouvez remplacer la première ligne par ces trois pour pouvoir utiliser une variable pour la longueur du pad:
padlimit=60
pad=$(printf '%*s' "$padlimit")
pad=${pad// /-}
Ainsi, le pad ( padlimit
et padlength
) pourrait être basé sur la largeur du terminal ( $COLUMNS
) ou calculé à partir de la longueur de la chaîne de données la plus longue.
Production:
a--------------------------------bbbbbbb
aa--------------------------------bbbbbb
aaaa-------------------------------bbbbb
aaaaaaaa----------------------------bbbb
Sans soustraire la longueur de la deuxième chaîne:
a---------------------------------------bbbbbbb
aa--------------------------------------bbbbbb
aaaa------------------------------------bbbbb
aaaaaaaa--------------------------------bbbb
La première ligne pourrait à la place être l'équivalent (similaire à sprintf
):
printf -v pad '%0.1s' "-"{1..60}
ou de même pour la technique plus dynamique:
printf -v pad '%*s' "$padlimit"
Vous pouvez tout faire l'impression sur une seule ligne si vous préférez:
printf '%s%*.*s%s\n' "$string1" 0 $((padlength - ${#string1} - ${#string2} )) "$pad" "$string2"