Pure 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"