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"
'%0.31s'
. Łańcuch (ostatni argument) jest obcinany do długości określonej po kropce. Zero zapobiega wyprowadzaniu wypełnienia spacji. Wyprowadzanych jest więc 31 łączników.padlength
do wybrania rzeczywistej długości do wydrukowania.Pure Bash. Użyj długości wartości „PROC_NAME” jako przesunięcia dla ustalonego ciągu „line”:
To daje
źródło
PROC_NAME
są spacje, chyba że zostały już zmienione . Otrzymasz jeden wiersz z dwoma tokenami każdy, a następnie [UP] na każde dwa oddzielone spacjami tokeny w zmiennej, a następnie jeden wiersz na końcu zawierającyline
tekst minus całkowita długość ciągu wejściowego. Dlatego bądź ostrożny, ponieważ może to prowadzić do interesujących i potencjalnie niebezpiecznych błędów, jeśli zostanie wykonane w złożonym skrypcie. W przeciwnym razie krótkie i proste. :)Trywialne (ale działające) rozwiązanie:
źródło
Myślę, że to najprostsze rozwiązanie. Czysta wbudowana powłoka, bez wbudowanej matematyki. Pożycza z poprzednich odpowiedzi.
Tylko podciągi i metazmienna $ {# ...}.
Produkuje
Produkuje
źródło
Nie ma sposobu na wypełnienie czymkolwiek poza użyciem spacji
printf
. Możesz użyćsed
:źródło
printf "%-50s@%s\n" ${PROC_NAME}@ [UP] | sed -e 's/ /-/g' -e 's/-@/ /' -e 's/@-/ /'
Wyjaśnienie:
printf '\055%.0s' {1..40}
- Utwórz 40 myślników(myślnik jest interpretowany jako opcja, więc zamiast tego użyj kodu ascii ze znakiem ucieczki)
"$PROC_NAME ..."
- Połącz $ PROC_NAME i myślniki| head -c 40
- Przytnij ciąg do pierwszych 40 znakówźródło
printf 'x' {1..40}
to robię , drukuje tylko pojedynczex
hmmmx
sprintf -- "-%.0s" {1..40}
Ten jest jeszcze prostszy i nie wykonuje żadnych zewnętrznych poleceń.
źródło
Proste, ale działa:
Przykład użycia:
Wyjście na stdout:
źródło
używając
echo
tylkoOdpowiedź @Dennis Williamson działa dobrze, z wyjątkiem tego, że próbowałem to zrobić za pomocą echa. Echo pozwala na wyświetlanie znaków o określonym kolorze. Używanie printf usuwałoby to zabarwienie i drukowało nieczytelne znaki. Oto
echo
jedyna alternatywa:wynik:
oczywiście możesz użyć wszystkich wariantów zaproponowanych przez @Dennis Williamson, niezależnie od tego, czy chcesz, aby prawa część była wyrównana do lewej lub prawej (zastąpiona
25 - ${#string1}
przez25 - ${#string1} - ${#string2}
itp ...źródło
Oto kolejny:
źródło
Jeśli kończysz znaki padów na jakimś stałym numerze kolumny, możesz przesadzić i wydłużyć
cut
:źródło
Prosty zakres / wypełnienie / wypełnienie / dopełnienie konsoli z automatycznym skalowaniem / metodą zmiany rozmiaru i przykładem.
Przykład:
create-console-spanner "loading graphics module" "[success]"
Teraz mamy w pełni funkcjonalny zestaw terminali z kolorowymi znakami, który robi wszystko, co dotyczy drukowania za pomocą klucza łańcuchowego sformatowanego w kolorze i stylu.
Aby wydrukować kolor , jest to dość proste:
paint-format "&red;This is %s\n" red
a później możesz chcieć pogrubić:paint-format "&bold;%s!\n" WOW
-l
Opcja zpaint-format
funkcją pomiaru tekst, dzięki czemu można zrobić operacje parametrów czcionki konsola.-v
Opcja zpaint-format
funkcją działa tak samo jakprintf
, ale nie może być dostarczony z-l
Teraz czas na rozpiętość !
paint-span "hello " . " &blue;world"
[uwaga: nie dodaliśmy sekwencji terminala nowej linii, ale tekst wypełnia terminal, więc następna linia wydaje się być tylko sekwencją terminala nowej linii]a wynikiem tego jest:
hello ............................. world
źródło
Bash + seq, aby umożliwić rozszerzanie parametrów
Podobnie jak odpowiedź @Dennis Williamson, ale jeśli
seq
jest dostępna, długość ciągu padu nie musi być zakodowana na stałe. Poniższy kod umożliwia przekazanie zmiennej do skryptu jako parametru pozycyjnego:Kod ASCII „2D” jest używany zamiast znaku „-”, aby uniknąć interpretowania go przez powłokę jako flagi polecenia. Inną opcją jest „3D” do użycia „=”.
W przypadku braku jakiejkolwiek długości dopełnienia przekazanej jako argument, powyższy kod domyślnie przyjmuje standardową szerokość terminala 80 znaków.
Aby skorzystać ze zmiennej powłoki bash
COLUMNS
(tj. Szerokości bieżącego terminala), zmienna środowiskowa musiałaby być dostępna dla skryptu. Jednym ze sposobów jest pozyskanie wszystkich zmiennych środowiskowych poprzez wykonanie skryptu poprzedzonego.
(polecenie „kropka”), na przykład:lub (lepiej) jawnie przekaż
COLUMNS
zmienną podczas wykonywania, na przykład:źródło