Bash ajoute des espaces de fin pour justifier la chaîne


20

Mon code actuel ressemble à ceci:, ce x=${y:0:40}qui limite la longueur de la chaîne à 40 caractères. En cas de chaîne de moins de 40 caractères, est-il possible de remplir les espaces de fin avec des espaces?

Donc, si mon y="very short text"

J'aimerais que mon y soit:

y = "texte très court (+25 espaces de fin) "

Réponses:


20

Si ces caractères sont tous codés sur un octet, c'est-à-dire si vous vous trouvez dans un environnement local où le jeu de caractères est à un octet (comme iso8859-1) ou si le jeu de caractères de l'environnement local est UTF-8 mais que le texte est en ASCII uniquement, vous pouvez le faire :

printf -v y %-40.40s "$y"

Cela couvrira à la fois la troncature et le remplissage.

Sinon, vous pouvez toujours ajouter 40 espaces et utiliser votre ${y:0:40}approche.

printf -v pad %40s
y=$y$pad
y=${y:0:40}

zsh a des opérateurs dédiés pour le rembourrage gauche et droit:

y=${(r:40:)y}

(fait également la troncature). zsh« de printfla numération en caractères au lieu d'octets, ne serait donc pas bash» la question de ci - dessus. Notez cependant que vous avez besoin de zsh5.3 ou plus récent pour le-v option.

Voir aussi cette réponse à une question connexe pour plus de détails si vous êtes confronté à des personnages qui n'ont pas tous la même largeur.


14

Vous devriez essayer printf:

printf '%-40s' "$y"

10

Pur bash:

ten="          " 
forty="$ten$ten$ten$ten" 
y="very short text"
y="${y:0:40}${forty:0:$((40 - ${#y}))}"
echo "'${y}'"

La méthode consiste à ajouter de 0 à 40 espaces à chaque chaîne après l'avoir tronquée.

Sortie, (notez les positions de guillemet simple):

'very short text                         '

1
Je préfère utiliser cette méthode, car elle fonctionne directement sur les variables et n'a pas besoin de sortie.
David Tabernero M.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.