Pure Bash, keine externen Dienstprogramme
Diese Demonstration ist vollständig gerechtfertigt, aber Sie können das Subtrahieren der Länge der zweiten Zeichenfolge einfach weglassen, wenn Sie unregelmäßige Linien wünschen.
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
Leider muss bei dieser Technik die Länge der Pad-Zeichenfolge fest codiert werden, um länger als die längste zu sein, die Sie für erforderlich halten. Die Pad-Länge kann jedoch wie gezeigt variabel sein. Sie können jedoch die erste Zeile durch diese drei ersetzen, um eine Variable für die Länge des Pads verwenden zu können:
padlimit=60
pad=$(printf '%*s' "$padlimit")
pad=${pad// /-}
Das Pad ( padlimit
und padlength
) könnte also auf der Terminalbreite ( $COLUMNS
) basieren oder aus der Länge der längsten Datenzeichenfolge berechnet werden.
Ausgabe:
a--------------------------------bbbbbbb
aa--------------------------------bbbbbb
aaaa-------------------------------bbbbb
aaaaaaaa----------------------------bbbb
Ohne die Länge der zweiten Zeichenfolge zu subtrahieren:
a---------------------------------------bbbbbbb
aa--------------------------------------bbbbbb
aaaa------------------------------------bbbbb
aaaaaaaa--------------------------------bbbb
Die erste Zeile könnte stattdessen das Äquivalent sein (ähnlich wie sprintf
):
printf -v pad '%0.1s' "-"{1..60}
oder ähnlich für die dynamischere Technik:
printf -v pad '%*s' "$padlimit"
Sie können alles in einer Zeile drucken, wenn Sie möchten:
printf '%s%*.*s%s\n' "$string1" 0 $((padlength - ${#string1} - ${#string2} )) "$pad" "$string2"
'%0.31s'
. Die Zeichenfolge (das letzte Argument) wird auf die nach dem Punkt angegebene Länge abgeschnitten. Die Null verhindert, dass Leerzeichen ausgegeben werden. Es werden also 31 Bindestriche ausgegeben.padlength
die tatsächliche Länge für die Ausgabe auswählen.Pure Bash. Verwenden Sie die Länge des Werts von 'PROC_NAME' als Offset für die feste Zeichenfolge 'line':
Das gibt
quelle
PROC_NAME
Leerzeichen vorhanden sind, es sei denn, sie sind bereits maskiert. Sie erhalten eine Zeile mit jeweils zwei Token und dann [UP] für jeweils zwei durch Leerzeichen getrennte Token in Ihrer Variablen und dann eine einzelne Zeile am Ende mit Ihremline
Text abzüglich der Gesamtlänge Ihrer Eingabezeichenfolge. Seien Sie also vorsichtig, da dies in einem komplexen Skript zu interessanten und möglicherweise unsicheren Fehlern führen kann. Ansonsten kurz und einfach. :)Triviale (aber funktionierende) Lösung:
quelle
Ich denke, das ist die einfachste Lösung. Pure Shell Builtins, keine Inline-Mathematik. Es leiht sich aus früheren Antworten.
Nur Teilzeichenfolgen und die Metavariable $ {# ...}.
Produziert
Produziert
quelle
Es gibt keine Möglichkeit, mit etwas anderem als Leerzeichen zu füllen
printf
. Sie können verwendensed
:quelle
printf "%-50s@%s\n" ${PROC_NAME}@ [UP] | sed -e 's/ /-/g' -e 's/-@/ /' -e 's/@-/ /'
Erläuterung:
printf '\055%.0s' {1..40}
- Erstellen Sie 40 Bindestriche(Bindestrich wird als Option interpretiert, verwenden Sie stattdessen maskierten ASCII-Code)
"$PROC_NAME ..."
- Verketten Sie $ PROC_NAME und Bindestriche| head -c 40
- Schneiden Sie die Zeichenfolge auf die ersten 40 Zeichenquelle
printf 'x' {1..40}
, druckt es nur einzelnex
hmmmx
sprintf -- "-%.0s" {1..40}
Dieser ist noch einfacher und führt keine externen Befehle aus.
quelle
Einfach, aber es funktioniert:
Anwendungsbeispiel:
Ausgabe an stdout:
quelle
mit
echo
nurDie Antwort von @Dennis Williamson funktioniert einwandfrei, außer dass ich versucht habe, dies mit Echo zu tun. Mit Echo können Zeichen mit einer bestimmten Farbe ausgegeben werden. Die Verwendung von printf würde diese Färbung entfernen und unlesbare Zeichen drucken. Hier ist die
echo
einzige Alternative:Ausgabe:
Natürlich können Sie alle von @Dennis Williamson vorgeschlagenen Variationen verwenden, unabhängig davon, ob der rechte Teil links oder rechts ausgerichtet sein soll (
25 - ${#string1}
durch25 - ${#string1} - ${#string2}
etc ...quelle
Hier ist ein anderes:
quelle
Wenn Sie die Pad-Zeichen an einer festen Spaltennummer beenden, können Sie sie überfüllen und
cut
auf Länge bringen:quelle
Einfache Konsolenspanne / Füllung / Pad / Padding mit automatischer Skalierungs- / Größenänderungsmethode und Beispiel.
Beispiel:
create-console-spanner "loading graphics module" "[success]"
Jetzt hier ist eine voll funktions-Farbe-Zeichen-Terminal-Suite , die mit einem Schraubenschlüssel auf Drucke mit einer Farbe und Stil formatierte String alles in Bezug tut.
Um eine Farbe zu drucken , ist das ganz einfach:
paint-format "&red;This is %s\n" red
Und vielleicht möchten Sie später fett werden:paint-format "&bold;%s!\n" WOW
Die
-l
Option für diepaint-format
Funktion misst den Text, sodass Sie Konsolenschriftmetrikoperationen ausführen können.Die
-v
Option für diepaint-format
Funktion funktioniert genausoprintf
, kann aber nicht bereitgestellt werden-l
Nun zum Spanning !
paint-span "hello " . " &blue;world"
[Hinweis: Wir haben keine Newline-Terminalsequenz hinzugefügt, aber der Text füllt das Terminal aus, sodass die nächste Zeile nur eine Newline-Terminalsequenz zu sein scheint.]und die Ausgabe davon ist:
hello ............................. world
quelle
Bash + seq, um die Parametererweiterung zu ermöglichen
Ähnlich wie bei der Antwort von @Dennis Williamson, aber falls
seq
verfügbar, muss die Länge der Pad-Zeichenfolge nicht fest codiert werden. Mit dem folgenden Code können Sie eine Variable als Positionsparameter an das Skript übergeben:Der ASCII-Code "2D" wird anstelle des Zeichens "-" verwendet, um zu vermeiden, dass die Shell ihn als Befehlsflag interpretiert. Eine andere Option ist "3D", um "=" zu verwenden.
In Ermangelung einer als Argument übergebenen Padlength wird im obigen Code standardmäßig die Standard-Terminalbreite von 80 Zeichen verwendet.
Um die Bash-Shell-Variable
COLUMNS
(dh die Breite des aktuellen Terminals) nutzen zu können, muss die Umgebungsvariable für das Skript verfügbar sein. Eine Möglichkeit besteht darin, alle Umgebungsvariablen durch Ausführen des vorangestellten Skripts.
(Befehl "dot") wie folgt zu erstellen:oder (besser) die
COLUMNS
Variable bei der Ausführung explizit übergeben , wie folgt:quelle