Pure Bash, bez zewnętrznych narzędzi
Ta demonstracja ma pełne uzasadnienie, ale możesz po prostu pominąć odejmowanie długości drugiego ciągu, jeśli chcesz, aby linie były nierówne.
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
Niestety, w tej technice długość struny pada musi być zakodowana na stałe, aby była dłuższa niż najdłuższa, której myślisz, że będziesz potrzebować, ale długość padu może być zmienną, jak pokazano. Możesz jednak zastąpić pierwszą linię tymi trzema, aby móc użyć zmiennej dla długości pada:
padlimit=60
pad=$(printf '%*s' "$padlimit")
pad=${pad// /-}
Zatem pad ( padlimit
i padlength
) może być oparty na szerokości terminala ( $COLUMNS
) lub obliczony na podstawie długości najdłuższego ciągu danych.
Wynik:
a--------------------------------bbbbbbb
aa--------------------------------bbbbbb
aaaa-------------------------------bbbbb
aaaaaaaa----------------------------bbbb
Bez odejmowania długości drugiej struny:
a---------------------------------------bbbbbbb
aa--------------------------------------bbbbbb
aaaa------------------------------------bbbbb
aaaaaaaa--------------------------------bbbb
Pierwsza linia mogłaby być odpowiednikiem (podobnym do sprintf
):
printf -v pad '%0.1s' "-"{1..60}
lub podobnie dla bardziej dynamicznej techniki:
printf -v pad '%*s' "$padlimit"
Jeśli wolisz, możesz wydrukować wszystko w jednej linii:
printf '%s%*.*s%s\n' "$string1" 0 $((padlength - ${#string1} - ${#string2} )) "$pad" "$string2"