El formato de texto es un tema interesante, especialmente cuando se trata de Bash. Aunque existen muchas herramientas para formatear texto, printf es único y universal. ¡Aprenda todo sobre printf en Bash para formatear su texto de la manera correcta!
Usando printf en Bash
C ++ y otros desarrolladores ya estarán familiarizados con printf como una magnífica manera de formatear la salida de texto al programar. Tener la misma herramienta disponible en Bash es de gran beneficio. printf le posibilita controlar y producir formatos de salida complejos, tal como lo desea. La página de manual de printf establece printf como una herramienta de ‘formato e impresión de datos’, que es exactamente lo que es y hace.
A modo de ejemplo, ¿le gustaría imprimir un número decimal con una longitud exacta de 3 bytes (o caracteres / números) para la parte entera (la parte antes del punto decimal o coma, dependiendo de en qué parte del mundo viva y cuál es su locale es) y 2 bytes (o caracteres / números) para la parte decimal del número? No hay problema, printf puede hacerlo y mucho más. Además podría enviar el texto a una columna específica en la pantalla, etc.
Aún cuando la sintaxis de printf, para un nuevo desarrollador, puede parecer confusa o compleja, en realidad es bastante sencilla. Solo hay un conjunto limitado de caracteres de formato comúnmente trabajadores que se pueden utilizar dentro de una definición de salida de printf. Echemos un vistazo a estos primero.
Sintaxis: printf
Estos son los más utilizados sintaxis printf modismos de formato de números:
%d or %i a signed decimal integer %u an unsigned decimal integer %f a decimal floating point number %e a scientific notation number %g will let printf use %e or %f, whichever is shorter %c a single character %s a string of characters %% a literal '%'
A continuación, es bueno saber cómo especificar opciones específicas en vinculación con estos modismos de formato. El formato para especificar opciones para estos es el siguiente:
%[flag(s)][width][.precision][length]number_formatting_idiom
Ejemplos: printf
Entonces, a modo de ejemplo, para tener un flotante con un ancho de 3 y una precisión de 2, debe especificar:
%3.2f
Veamos un ejemplo:
printf "%3.2fn" "100.304"
Sencillo y sencillo. Tenga en cuenta que podríamos haber utilizado una variable en lugar de "100.304"
:
VAR1=100.304 printf "%3.2fn" ${VAR1}
Note además cómo agregamos una nueva línea usando un n
secuencia de nueva línea. Para obtener una lista completa de las secuencias interpretadas disponibles, consulte man printf
. Los mas comunes son n
para nueva línea, t
para pestaña y para una barra invertida.
En el formato de alternativas anterior además vimos cómo podemos especificar banderas. Hay una cantidad limitada de banderas comunes:
- Left-justify text (right-justify is the default) + Forces the use of a sign, even if positive ' ' A space is inserted if no sign will be used 0 Left-pad the number with zeroes instead of spaces when padding is specified
Así, a modo de ejemplo, podemos tener:
VAR1=-100.304 VAR2=100.304 printf "% 3.2ftt%+3.2fn" ${VAR1} ${VAR2}
Aquí usamos dos variables y separamos la salida por dos pestañas usando dos t
secuencias de pestañas. Además insertamos un espacio (como una bandera) entre %
y la definición de ancho. Esto llevó al número negativo en VAR1
a imprimir con un signo negativo. Si el número hubiera sido positivo, no se habría impreso ningún signo y, en cambio, se habría impreso un espacio en la misma posición.
Para terminar usamos el +
bandera y, en realidad, nuestro número se emite con un +
signo independientemente del hecho de que el número ya es positivo y, por eso, (regularmente) no se imprimirá ningún signo.
Entonces, ¿cómo podemos asegurarnos de tener ceros o espacios a la izquierda, sin dejar de tener una longitud específica? Primero, tenemos que asegurarnos de que el ancho de nuestra definición sea más largo que el contenido variable, y en segundo lugar podemos utilizar el 0
bandera para mostrar ceros a la izquierda:
VAR1=-100.304 VAR2=100.304 printf "% 13.2fn%013.2fn%13.2f" ${VAR1} ${VAR2} ${VAR1}
En este ejemplo, imprimimos 3 líneas, separadas dos veces por el n
secuencia de nueva línea. Inmediatamente notamos que si no hay una nueva línea al final de la salida, nuestro indicador Bash regresa específicamente al final de nuestra tercera línea de salida.
Este puede no ser un formato agradable o útil en modo interactivo en la terminal, pero desde dentro de un script (piense, a modo de ejemplo, en una secuencia como 1...2...3...
que se construye paso a paso en la pantalla a medida que se avanza dentro del código) esto puede ser muy útil.
En la segunda línea de salida, usamos el 0
bandera para indicar que nos gustaría utilizar ceros a la izquierda para VAR2
. En realidad, la salida arroja ceros a la izquierda, hasta la longitud establecida.
En la primera línea de salida, insertamos un espacio mientras que en la tercera línea de salida (ambos imprimiendo el VAR1
variable) no lo hicimos. La salida es la misma, que es la única rareza que encontré mientras trabajaba con printf
; uno esperaría que hubiera un carácter adicional dado el definición de bandera de espacio printf. Esto sigue siendo el mismo inclusive si usáramos ceros a la izquierda. Además permanece igual si no se especifica la longitud.
Por tanto, la usabilidad de la bandera espacial puede ser limitada en algunos casos (números negativos). Este no es el caso de los números positivos:
VAR1=100.304 printf "% fn%0fn" ${VAR1} ${VAR1}
En esta circunstancia (números positivos), el bandera espacial funciona como se esperaba, y se inserta un espacio extra en el caso de la primera VAR1
producción.
Conclusión
El uso de printf desde dentro de los scripts Bash o en la línea de comando puede producir una salida clara y bien establecida. Si escala las variables correctamente (y tal vez el rango, verifíquelas con certeza), usando printf le dará un método flexible para formatear la salida (y el diseño general de la pantalla para aplicaciones más grandes) como usted elija.
En este post, analizamos los modismos de formato de números de uso común, cómo establecer el ancho de la parte entera y decimal de los números, y revisamos las banderas más utilizadas en printf. ¡Disfrute imprimiendo datos bien formateados con printf!