Чистый 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"
'%0.31s'
. Строка (последний аргумент) обрезается до длины, указанной после точки. Ноль предотвращает вывод любого пробела. Таким образом выводится 31 дефис.padlength
для выбора фактической длины для вывода.Чистый Баш. Используйте длину значения PROC_NAME в качестве смещения для фиксированной строки line:
Это дает
источник
PROC_NAME
есть пробелы, если они уже не экранированы. Вы получите одну строку с двумя токенами в каждой, а затем [ВВЕРХ] для каждых двух разделенных пробелами токенов в вашей переменной, а затем одну строку в конце с вашимline
текстом за вычетом общей длины вашей входной строки. Так что будьте осторожны, поскольку это может привести к интересным и потенциально небезопасным ошибкам, если будет сделано в сложном сценарии. В остальном коротко и просто. :)Тривиальное (но рабочее) решение:
источник
Думаю, это простейшее решение. Чистая встроенная оболочка, без встроенной математики. Это заимствует из предыдущих ответов.
Просто подстроки и метапеременная $ {# ...}.
Производит
Производит
источник
Нет возможности использовать что-либо, кроме пробелов
printf
. Вы можете использоватьsed
:источник
printf "%-50s@%s\n" ${PROC_NAME}@ [UP] | sed -e 's/ /-/g' -e 's/-@/ /' -e 's/@-/ /'
Пояснение:
printf '\055%.0s' {1..40}
- Создайте 40 тире(тире интерпретируется как опция, поэтому вместо этого используйте экранированный код ascii)
"$PROC_NAME ..."
- Объединить $ PROC_NAME и тире| head -c 40
- Обрезать строку до первых 40 символовисточник
printf 'x' {1..40}
печатает только синглx
хмммx
секprintf -- "-%.0s" {1..40}
Этот еще проще и не выполняет никаких внешних команд.
источник
Просто, но работает:
Пример использования:
Вывод в стандартный вывод:
источник
используя
echo
толькоAnwser @Dennis Williamson работает нормально, за исключением того, что я пытался сделать это с помощью echo. Echo позволяет выводить символы определенного цвета. Использование printf удалит эту окраску и напечатает нечитаемые символы. Вот
echo
альтернатива -only:вывод:
конечно, вы можете использовать все варианты, предложенные @Dennis Williamson, независимо от того, хотите ли вы, чтобы правая часть была выровнена по левому или правому краю (заменив
25 - ${#string1}
на и25 - ${#string1} - ${#string2}
т. д.)источник
Вот еще один:
источник
Если вы заканчиваете вводные символы на каком-то фиксированном номере столбца, вы можете набрать и увеличить
cut
длину:источник
Простая консоль Span / Fill / Pad / Padding с автоматическим масштабированием / изменением размера Метод и пример.
Пример:
create-console-spanner "loading graphics module" "[success]"
Теперь вот полнофункциональный набор-терминал-цвет-символ-терминал, который делает все, что касается печати строки, отформатированной по цвету и стилю с помощью гаечного ключа.
Чтобы распечатать цвет , это достаточно просто:
paint-format "&red;This is %s\n" red
и вы, возможно, захотите выделить позже:paint-format "&bold;%s!\n" WOW
-l
Вариант кpaint-format
функции измеряет текст , так что вы можете сделать метрики консоли шрифтов операций.-v
Опция кpaint-format
функции работает так же , как ,printf
но не может быть снабжена-l
Теперь о покрытии !
paint-span "hello " . " &blue;world"
[примечание: мы не добавляли терминальную последовательность новой строки, но текст заполняет терминал, поэтому следующая строка кажется только терминальной последовательностью новой строки]и результат этого:
hello ............................. world
источник
Bash + seq, чтобы разрешить расширение параметра
Подобно ответу @Dennis Williamson, но, если
seq
он доступен, длину строки заполнения не нужно жестко задавать. Следующий код позволяет передавать переменную скрипту в качестве позиционного параметра:Код ASCII «2D» используется вместо символа «-», чтобы оболочка не интерпретировала его как командный флаг. Другой вариант - «3D» использовать «=».
В отсутствие какой-либо длины поля, переданной в качестве аргумента, в приведенном выше коде по умолчанию используется стандартная ширина терминала 80 символов.
Чтобы воспользоваться преимуществами переменной оболочки bash
COLUMNS
(т. Е. Шириной текущего терминала), переменная среды должна быть доступна сценарию. Один из способов - получить все переменные среды, выполнив сценарий, которому предшествует.
(команда "точка"), например:или (лучше) явно передать
COLUMNS
переменную при выполнении, например:источник