Pure Bash, pas d'utilitaires externes
Cette démonstration fait une justification complète, mais vous pouvez simplement omettre de soustraire la longueur de la deuxième chaîne si vous voulez des lignes irrégulières.
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
Malheureusement, dans cette technique, la longueur de la chaîne de pad doit être codée en dur pour être plus longue que la plus longue dont vous pensez avoir besoin, mais la longueur de pad peut être une variable comme indiqué. Cependant, vous pouvez remplacer la première ligne par ces trois pour pouvoir utiliser une variable pour la longueur du pad:
padlimit=60
pad=$(printf '%*s' "$padlimit")
pad=${pad// /-}
Ainsi, le pad ( padlimit
et padlength
) pourrait être basé sur la largeur du terminal ( $COLUMNS
) ou calculé à partir de la longueur de la chaîne de données la plus longue.
Production:
a--------------------------------bbbbbbb
aa--------------------------------bbbbbb
aaaa-------------------------------bbbbb
aaaaaaaa----------------------------bbbb
Sans soustraire la longueur de la deuxième chaîne:
a---------------------------------------bbbbbbb
aa--------------------------------------bbbbbb
aaaa------------------------------------bbbbb
aaaaaaaa--------------------------------bbbb
La première ligne pourrait à la place être l'équivalent (similaire à sprintf
):
printf -v pad '%0.1s' "-"{1..60}
ou de même pour la technique plus dynamique:
printf -v pad '%*s' "$padlimit"
Vous pouvez tout faire l'impression sur une seule ligne si vous préférez:
printf '%s%*.*s%s\n' "$string1" 0 $((padlength - ${#string1} - ${#string2} )) "$pad" "$string2"
'%0.31s'
. La chaîne (le dernier argument) est tronquée à la longueur spécifiée après le point. Le zéro empêche tout remplissage d'espace d'être sorti. Ainsi, 31 traits d'union sont émis.padlength
pour sélectionner la longueur réelle à afficher.Pure Bash. Utilisez la longueur de la valeur de "PROC_NAME" comme décalage pour la chaîne fixe "line":
Cela donne
la source
PROC_NAME
a des espaces à moins qu'ils ne soient déjà échappés. Vous obtiendrez une ligne avec deux jetons chacun, puis [UP] tous les deux jetons séparés par des espaces dans votre variable, puis une seule ligne à la fin avec votreline
texte moins la longueur totale de votre chaîne d'entrée. Soyez donc prudent, car cela pourrait conduire à des bogues intéressants et potentiellement non sécurisés si cela est fait dans un script complexe. Sinon bref et simple. :)Solution triviale (mais fonctionnelle):
la source
Je pense que c'est la solution la plus simple. Builtins shell purs, pas de mathématiques en ligne. Il emprunte aux réponses précédentes.
Juste des sous-chaînes et la méta-variable $ {# ...}.
Produit
Produit
la source
Il n'y a aucun moyen de remplir avec autre chose que des espaces en utilisant
printf
. Vous pouvez utilisersed
:la source
printf "%-50s@%s\n" ${PROC_NAME}@ [UP] | sed -e 's/ /-/g' -e 's/-@/ /' -e 's/@-/ /'
Explication:
printf '\055%.0s' {1..40}
- Créez 40 tirets(le tiret est interprété comme une option donc utilisez plutôt le code ascii échappé)
"$PROC_NAME ..."
- Concaténer $ PROC_NAME et les tirets| head -c 40
- Couper la chaîne aux 40 premiers caractèresla source
printf 'x' {1..40}
n'imprime qu'un seulx
hmmmx
sprintf -- "-%.0s" {1..40}
Celui-ci est encore plus simple et n'exécute aucune commande externe.
la source
Simple mais ça marche:
Exemple d'utilisation:
Sortie vers stdout:
la source
en utilisant
echo
uniquementLa réponse de @Dennis Williamson fonctionne très bien sauf que j'essayais de le faire en utilisant echo. Echo permet de sortir des caractères avec une certaine couleur. L'utilisation de printf supprimerait cette coloration et imprimerait des caractères illisibles. Voici la
echo
seule alternative:production:
bien sûr, vous pouvez utiliser toutes les variantes proposées par @Dennis Williamson que vous souhaitiez que la partie droite soit alignée à gauche ou à droite (en remplaçant
25 - ${#string1}
par25 - ${#string1} - ${#string2}
etc ...la source
En voici un autre:
la source
Si vous terminez les caractères du pad à un numéro de colonne fixe, vous pouvez surcharger et
cut
à la longueur:la source
Simple Console Span / Fill / Pad / Padding avec méthode de mise à l'échelle / redimensionnement automatique et exemple.
Exemple:
create-console-spanner "loading graphics module" "[success]"
Voici maintenant une suite complète de terminaux de caractères couleur qui fait tout ce qui concerne l'impression d'une chaîne formatée en couleur et en style avec une clé.
Pour imprimer une couleur , c'est assez simple:
paint-format "&red;This is %s\n" red
et vous voudrez peut-être devenir gras plus tard:paint-format "&bold;%s!\n" WOW
L'
-l
option de lapaint-format
fonction mesure le texte afin que vous puissiez effectuer des opérations de métrique de police de la console.L'
-v
option de lapaint-format
fonction fonctionne de la même manièreprintf
mais ne peut pas être fournie avec-l
Maintenant pour le spanning !
paint-span "hello " . " &blue;world"
[note: nous n'avons pas ajouté de séquence de terminal de nouvelle ligne, mais le texte remplit le terminal, donc la ligne suivante ne semble être qu'une séquence de terminal de nouvelle ligne]et le résultat est:
hello ............................. world
la source
Bash + seq pour permettre l'expansion des paramètres
Similaire à la réponse @Dennis Williamson, mais si elle
seq
est disponible, la longueur de la chaîne de remplissage n'a pas besoin d'être codée en dur. Le code suivant permet de transmettre une variable au script en tant que paramètre de position:Le code ASCII "2D" est utilisé à la place du caractère "-" pour éviter que le shell ne l'interprète comme un drapeau de commande. Une autre option est "3D" pour utiliser "=".
En l'absence de toute longueur de pad passée en argument, le code ci-dessus utilise par défaut la largeur de terminal standard de 80 caractères.
Pour tirer parti de la variable shell bash
COLUMNS
(c'est-à-dire la largeur du terminal actuel), la variable d'environnement doit être disponible pour le script. Une façon est de rechercher toutes les variables d'environnement en exécutant le script précédé de.
(commande "point"), comme ceci:ou (mieux) transmettre explicitement la
COLUMNS
variable lors de l'exécution, comme ceci:la source