Чистий Bash, без зовнішніх утиліт
Ця демонстрація дає повне обгрунтування, але ви можете просто опустити віднімання довжини другого рядка, якщо ви хочете нерівні праві лінії.
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
На жаль, у цій техніці довжина накладки колодки повинна бути жорстко закодована, щоб бути довшою, ніж найдовша, яка, на вашу думку, вам знадобиться, але довжина колодки може бути змінною, як показано. Однак ви можете замінити перший рядок на ці три, щоб мати можливість використовувати змінну для довжини колодки:
padlimit=60
pad=$(printf '%*s' "$padlimit")
pad=${pad// /-}
Таким чином, майданчик ( padlimit
і padlength
) може базуватися на ширині терміналу ( $COLUMNS
) або обчислюватися з довжини найдовшого рядка даних.
Вихід:
a--------------------------------bbbbbbb
aa--------------------------------bbbbbb
aaaa-------------------------------bbbbb
aaaaaaaa----------------------------bbbb
Не віднімаючи довжину другого рядка:
a---------------------------------------bbbbbbb
aa--------------------------------------bbbbbb
aaaa------------------------------------bbbbb
aaaaaaaa--------------------------------bbbb
Перший рядок замість цього може бути еквівалентом (подібним до sprintf
):
printf -v pad '%0.1s' "-"{1..60}
або аналогічно для більш динамічної методики:
printf -v pad '%*s' "$padlimit"
Ви можете зробити друк на одному рядку, якщо вам зручніше:
printf '%s%*.*s%s\n' "$string1" 0 $((padlength - ${#string1} - ${#string2} )) "$pad" "$string2"