
Para repetir un carácter N veces, podríamos usar printf
. Por ejemplo, para repetir @
20 veces, podríamos usar algo como esto:
N=20
printf '@%.0s' $(seq 1 $N)
producción:
@@@@@@@@@@@@@@@@@@@@
Sin embargo, no hay ningún carácter de nueva línea al final de esa cadena. Intenté canalizar la salida a sed
:
printf '@%.0s' $(seq 1 $N) | sed '$s/$/\n/'
¿Es posible lograr el mismo resultado con un solo printf
(agregando un carácter de nueva línea al final de la salida) sin usar sed?
Respuesta1
printf %.1s @{1..20} $'\n'
el caparazón expande los tirantes primero, esto se llama "Expansión de tirantes".
@{1..20}
into @1 @2 @3 ...
y así sucesivamente.
Luego se generará el primer byte de cada parámetro, incluido el último argumento $'\n'
que consta de un byte: el carácter de nueva línea.
Respuesta2
Con zsh
:
printf '%s\n' ${(l[20][@])}
(usando el l
relleno izquierdobandera de expansión de parámetros. También puedes usar el r
acolchado derecho aquí).
Por supuesto, no es necesario utilizar printf
. También puedes usar print
o echo
aquí, que agrega un \n
valor predeterminado. ( printf '%s\n' "$string"
se puede escribir print -r -- "$string"
o echo -E - "$string"
en zsh
, aunque si $string
no contiene barras invertidas y no comienza con -
, se puede simplificar a print "$string"
/ echo "$string"
).
Si el objetivo final es mostrar una lista de cadenas rellenadas con el ancho de la pantalla, harías:
$ lines=(short 'longer text' 'even longer')
$ print -rC1 -- ${(ml[$COLUMNS][@][ ])lines}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ short
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ longer text
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ even longer
$ print -rC1 -- ${(mr[$COLUMNS][@][ ])lines}
short @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
longer text @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
even longer @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Donde la m
bandera hace que zsh tenga en cuenta el ancho de visualización de cada carácter (como los caracteres de doble ancho anteriores (que es posible que su navegador no represente exactamente con doble ancho, pero su terminal debería hacerlo)).
print -rC1 --
es como printf '%s\n'
o print -rl --
para imprimir un elemento por línea excepto en el caso en el que no se le pasan argumentos (como cuando lines=()
), en cuyo caso no imprime nada en lugar de una línea vacía).
Respuesta3
Yo uso esto en un script:
printf '%150s\n' | tr ' ' '@'
Respuesta4
Una solución a la publicación original, de hace más de un año:
repetir un carácter usando printf y agregar una nueva línea al final
printf '@%.0s' $(seq 1 $N); echo
Por si acaso alguien más tiene el mismo problema o uno similar.