Pure Bash, nessuna utilità esterna
Questa dimostrazione fornisce una giustificazione completa, ma puoi semplicemente omettere di sottrarre la lunghezza della seconda stringa se vuoi linee irregolari.
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
Sfortunatamente, in quella tecnica, la lunghezza della stringa del pad deve essere codificata per essere più lunga di quella più lunga di cui pensi di aver bisogno, ma la lunghezza del pad può essere una variabile come mostrato. Tuttavia, puoi sostituire la prima riga con queste tre per poter utilizzare una variabile per la lunghezza del pad:
padlimit=60
pad=$(printf '%*s' "$padlimit")
pad=${pad// /-}
Quindi il pad ( padlimit
e padlength
) potrebbe essere basato sulla larghezza del terminale ( $COLUMNS
) o calcolato dalla lunghezza della stringa di dati più lunga.
Produzione:
a--------------------------------bbbbbbb
aa--------------------------------bbbbbb
aaaa-------------------------------bbbbb
aaaaaaaa----------------------------bbbb
Senza sottrarre la lunghezza della seconda stringa:
a---------------------------------------bbbbbbb
aa--------------------------------------bbbbbb
aaaa------------------------------------bbbbb
aaaaaaaa--------------------------------bbbb
La prima riga potrebbe invece essere l'equivalente (simile a sprintf
):
printf -v pad '%0.1s' "-"{1..60}
o similmente per la tecnica più dinamica:
printf -v pad '%*s' "$padlimit"
Puoi stampare tutto su una riga se preferisci:
printf '%s%*.*s%s\n' "$string1" 0 $((padlength - ${#string1} - ${#string2} )) "$pad" "$string2"