Bash agrega espacios finales para justificar la cadena

20

Mi código actual es el siguiente: x=${y:0:40}, lo que limita la longitud de cadena de 40 caracteres. En caso de cadena más corta que 40 caracteres, es posible cubrir los puestos se arrastran con espacios?

Entonces si mi y="very short text"

Me gustaría que mi y sea:

y = "texto muy corto (+25 espacios finales) "

usuario222977
fuente

Respuestas:

20

Si todos esos caracteres son de un solo byte, es decir, si se encuentra en un entorno local donde el conjunto de caracteres es de un solo byte (como iso8859-1) o si el conjunto de caracteres del entorno local es UTF-8 pero el texto es solo ASCII, puede hacerlo :

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

Eso cubrirá tanto el truncamiento como el relleno.

Si no, siempre se puede añadir 40 plazas y usar su ${y:0:40}enfoque.

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

zsh tiene operadores dedicados para el relleno izquierda y derecha:

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

(también hace truncamiento). zsh's printfcuenta en caracteres en lugar de bytes, por lo que no tendrían bash' s tema anterior. Sin embargo en cuenta que necesita zsh5.3 o posterior para la -vopción.

Véase también la respuesta a una pregunta relacionada para más detalles si se enfrenta con personajes que no todos tienen la misma anchura.

Stéphane Chazelas
fuente
14

Deberías probar printf:

printf '%-40s' "$y"

fuente
10

Puro bash :

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

El método consiste en añadir 0-40 espacios para cada cadena después de que truncar.

Salida, (tenga en cuenta las posiciones de comillas simples):

'very short text                         '
agc
fuente
1
Prefiero usar este método, ya que se trabaja directamente sobre las variables y no es necesario para la salida.
David M. Tabernero