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) "

user222977
la source

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.

Stéphane Chazelas
la source
14

Vous devriez essayer printf:

printf '%-40s' "$y"

la source
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                         '
agc
la source
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.