Pure Bash, sin utilidades externas
Esta demostración tiene una justificación completa, pero puede omitir restar la longitud de la segunda cadena si desea líneas irregulares a la derecha.
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
Desafortunadamente, en esa técnica, la longitud de la cuerda de la almohadilla debe estar codificada para que sea más larga que la más larga que cree que necesitará, pero la longitud de la almohadilla puede ser una variable como se muestra. Sin embargo, puede reemplazar la primera línea con estas tres para poder usar una variable para la longitud del pad:
padlimit=60
pad=$(printf '%*s' "$padlimit")
pad=${pad// /-}
Entonces, el pad ( padlimit
y padlength
) podría basarse en el ancho de la terminal ( $COLUMNS
) o calcularse a partir de la longitud de la cadena de datos más larga.
Salida:
a--------------------------------bbbbbbb
aa--------------------------------bbbbbb
aaaa-------------------------------bbbbb
aaaaaaaa----------------------------bbbb
Sin restar la longitud de la segunda cadena:
a---------------------------------------bbbbbbb
aa--------------------------------------bbbbbb
aaaa------------------------------------bbbbb
aaaaaaaa--------------------------------bbbb
En cambio, la primera línea podría ser el equivalente (similar a sprintf
):
printf -v pad '%0.1s' "-"{1..60}
o similar para la técnica más dinámica:
printf -v pad '%*s' "$padlimit"
Puede imprimir todo en una línea si lo prefiere:
printf '%s%*.*s%s\n' "$string1" 0 $((padlength - ${#string1} - ${#string2} )) "$pad" "$string2"
'%0.31s'
. La cadena (el argumento final) se trunca a la longitud especificada después del punto. El cero evita que se genere cualquier relleno de espacio. Por tanto, se emiten 31 guiones.padlength
para seleccionar la longitud real a la salida.Pure Bash. Utilice la longitud del valor de 'PROC_NAME' como compensación para la cadena fija 'línea':
Esto da
fuente
PROC_NAME
tiene espacios a menos que ya se hayan escapado. Obtendrá una línea con dos tokens cada uno y luego [ARRIBA] por cada dos tokens separados por espacios en su variable y luego una sola línea al final con suline
texto menos la longitud total de su cadena de entrada. Así que tenga cuidado, ya que esto podría generar errores interesantes y potencialmente inseguros si se hace en un script complejo. De lo contrario, breve y simple. :)Solución trivial (pero funcional):
fuente
Creo que esta es la solución más sencilla. Incorporaciones de shell puro, sin matemáticas en línea. Toma prestado de respuestas anteriores.
Solo subcadenas y la metavariable $ {# ...}.
Produce
Produce
fuente
No hay forma de rellenar con nada más que espacios usando
printf
. Puede utilizarsed
:fuente
printf "%-50s@%s\n" ${PROC_NAME}@ [UP] | sed -e 's/ /-/g' -e 's/-@/ /' -e 's/@-/ /'
Explicación:
printf '\055%.0s' {1..40}
- Cree 40 guiones(el guión se interpreta como una opción, así que use código ascii de escape en su lugar)
"$PROC_NAME ..."
- Concatenar $ PROC_NAME y guiones| head -c 40
- Recorte la cadena a los primeros 40 caracteresfuente
printf 'x' {1..40}
solo imprime unax
hmmmx
sprintf -- "-%.0s" {1..40}
Este es aún más simple y no tiene comandos externos.
fuente
Simple pero funciona:
Ejemplo de uso:
Salida a stdout:
fuente
usando
echo
soloLa respuesta de @Dennis Williamson está funcionando bien, excepto que estaba tratando de hacer esto usando echo. Echo permite generar caracteres con un color determinado. El uso de printf eliminaría ese color e imprimiría caracteres ilegibles. Aquí está la
echo
única alternativa:salida:
por supuesto, puede usar todas las variaciones propuestas por @Dennis Williamson si desea que la parte derecha esté alineada a la izquierda o a la derecha (reemplazando
25 - ${#string1}
por25 - ${#string1} - ${#string2}
etc ...fuente
Aqui hay otro más:
fuente
Si está terminando los caracteres del pad en algún número de columna fijo, entonces puede overpad y
cut
a la longitud:fuente
Consola simple Span / Fill / Pad / Padding con método y ejemplo de escalado / cambio de tamaño automático.
Ejemplo:
create-console-spanner "loading graphics module" "[success]"
Ahora aquí hay una suite de terminales de caracteres de color con todas las funciones que hace todo lo que se refiere a imprimir una cadena con formato de color y estilo con una llave inglesa.
Para imprimir un color , eso es bastante simple:
paint-format "&red;This is %s\n" red
y es posible que desee ponerse en negrita más adelante:paint-format "&bold;%s!\n" WOW
La
-l
opción de lapaint-format
función mide el texto para que pueda realizar operaciones de métricas de fuente de consola.La
-v
opción de lapaint-format
función funciona igual queprintf
pero no se puede suministrar con-l
¡Ahora para la expansión !
paint-span "hello " . " &blue;world"
[nota: no agregamos una secuencia de terminal de nueva línea, pero el texto llena la terminal, por lo que la siguiente línea solo parece ser una secuencia de terminal de nueva línea]y el resultado de eso es:
hello ............................. world
fuente
Bash + seq para permitir la expansión de parámetros
Similar a la respuesta de @Dennis Williamson, pero si
seq
está disponible, la longitud de la cadena del pad no necesita estar codificada. El siguiente código permite pasar una variable al script como parámetro posicional:Se utiliza el código ASCII "2D" en lugar del carácter "-" para evitar que el shell lo interprete como una bandera de comando. Otra opción es "3D" para usar "=".
En ausencia de cualquier longitud de padlength pasada como argumento, el código anterior tiene como valor predeterminado el ancho de terminal estándar de 80 caracteres.
Para aprovechar la variable de shell bash
COLUMNS
(es decir, el ancho de la terminal actual), la variable de entorno debería estar disponible para el script. Una forma es obtener todas las variables de entorno ejecutando el script precedido por.
(comando "punto"), así:o (mejor) pasar explícitamente la
COLUMNS
variable al ejecutar, así:fuente