¿Existe algún comando de Linux incorporado que permita generar una cadena que sea n veces una cadena de entrada?
¿Existe algún comando de Linux incorporado que permita generar una cadena que sea n veces una cadena de entrada?
Respuestas:
adrian@Fourier:~$ printf 'HelloWorld\n%.0s' {1..5}
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$
printf
es que aplicará repetidamente argumentos en exceso a la cadena de formato, "bucleando" de forma gratuita. Por "exceso", quiero decir que hay más argumentos que %
marcadores de posición.
Aquí hay una forma anticuada que es bastante portátil:
yes "HelloWorld" | head -n 10
Esta es una versión más convencional de la respuesta de Adrian Petrescu usando la expansión de llaves:
for i in {1..5}
do
echo "HelloWorld"
done
Eso es equivalente a:
for i in 1 2 3 4 5
Esta es una versión un poco más concisa y dinámica de la respuesta de Pike :
printf -v spaces '%*s' 10 ''; printf '%s\n' ${spaces// /ten}
sed -n 'H;${x;s/\n//gp}'
u sed -n ':t;${s/\n//gp};N;bt'
otra es hacer lo echo $(yes "HelloWorld" | head -n 10)
que agrega un espacio entre cada copia de la cadena. Otra forma es canalizarlo, lo tr -d '\n'
que también elimina la nueva línea final.
yes
solución era exactamente lo que necesitaba, ya que quería duplicar un comando (cuya salida fluctúa). Por lo tanto:yes "$(my-command)" | head -n 2
Esto se puede parametrizar y no requiere una variable temporal, FWIW:
printf "%${N}s" | sed 's/ /blah/g'
O, si $N
es del tamaño de una matriz bash:
echo ${ARR[@]/*/blah}
printf
el especificador de formato. ¿Qué pasa si los datos contienen cadenas de formato? Esta es la forma correcta de especificar dinámicamente la "precisión" (longitud): printf '%*s' "$N"
- habitúese a encerrar la cadena de formato entre comillas simples para evitar la expansión de variables allí.
Algunas buenas maneras ya mencionadas. Sin seq
embargo, no puedo olvidar lo bueno :
[john @ awesome] $ para i en `seq 5`; hacer eco "Hola"; hecho Hola Hola Hola Hola Hola
{i..j}
truco nunca devuelve un rango vacío.)
Quizás otra forma que sea más general y útil para usted:
adrian@Fourier:~$ n=5
adrian@Fourier:~$ for (( c=1; c<=n; c++)) ; do echo "HelloWorld" ; done
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$
El bash shell es más poderoso de lo que la mayoría de la gente piensa :)
yes
, printf
, for i in {1..5}
) que si el n
es cero, devuelve una cadena vacía y sin existir estado de 1. También debido a la notación matemática para la comparación, es fácil haber compensado por 1 (por ejemplo, cambiando la <=
que <
)
Puedes usar un truco. Hacer eco de una variable vacía no imprime nada. Entonces puedes escribir:
echo word$wojek{1..100}
Si $wojek1 $wojek2
... $wojek100
son variables no existentes, se repetirá su palabra 100 veces sin nada más.
$_
lugar de $wojek
aclare la intención.
Repita los n
tiempos, solo ponga n-1
comas entre {}
:
$ echo 'helloworld'{,,}
helloworld helloworld helloworld
Repite 'helloworld' dos veces después del primer eco.
n
de una variable?
awk 'BEGIN {while (c++<4) printf "Hello"}'
Resultado
Hola hola hola hola
basado en lo que @pike estaba insinuando
por cada caracter en string echo string
echo ${target//?/$replace}
Un ejemplo de un encabezado subrayado con =
caracteres.
export heading='ABCDEF';
export replace='=';
echo -e "${heading}\n${heading//?/$replace}"
saldrá
ABCDEF
======
Esto parece tener un puerto entre Linux y OS X y eso me hace feliz.
nJoy!
Si estás en BSD, puedes usarlo seq
.
$ seq -f "Hello, world" 5
Hello, world
Hello, world
Hello, world
Hello, world
Hello, world
seq (GNU coreutils) 8.25
, esto da seq: format 'Hello, world' has no % directive
, obligando a una directiva de formato a estar presente. GNU coreutils se utilizan, por ejemplo, en muchas distribuciones de Linux y Cygwin. Incluyendo la información aquí para aquellos que faltan la información de que solo funciona en BSD seq.
line="==========================="
line=${line:0:10}
${line//"="/"ten "}
salidas
ten ten ten ten ten ten ten ten ten ten
Suponiendo que desea algo como el x
operador de Perl , donde no obtiene automáticamente una nueva línea entre repeticiones:
x() {
# usage: x string num
for i in $(seq 1 $2); do printf "%s" "$1"; done
# print a newline only if the string does not end in a newline
[[ "$1" == "${1%$'\n'}" ]] && echo ""
}
x Hi 10 # ==> HiHiHiHiHiHiHiHiHiHi
x $'Hello World!\n' 3
Explícitamente utilicé un for
bucle porque no puedes escribir {1..$n}
en bash: la expansión de llaves se realiza antes de la sustitución de variables.
No está exactamente integrado en Linux, pero si tienes Python instalado ...
python
>>>var = "string"
>>>var*n
O en una línea, como sugirió el comentarista:
python -c 'print "This is a test.\n" * 10'
Prueba este:
echo $(for i in $(seq 1 100); do printf "-"; done)
Creará (cien guiones):