Чистый 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"