web-dev-qa-db-fra.com

Commande Linux pour répéter une chaîne n fois

Existe-t-il une commande Linux intégrée permettant de générer une chaîne représentant n fois une chaîne d'entrée?

67
GetFree
adrian@Fourier:~$ printf 'HelloWorld\n%.0s' {1..5}
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$
70
Adrian Petrescu

Voici une manière démodée qui est assez portable:

yes "HelloWorld" | head -n 10

Ceci est une version plus conventionnelle de de Adrian Petrescu en utilisant le développement d'accolade:

for i in {1..5}
do
    echo "HelloWorld"
done

Cela équivaut à:

for i in 1 2 3 4 5

Ceci est une version un peu plus concise et dynamique de la réponse de pike :

printf -v spaces '%*s' 10 ''; printf '%s\n' ${spaces// /ten}
67
Dennis Williamson

Quelques bonnes manières déjà mentionnées. Je ne peux pas oublier le bon vieux seq cependant:

[john @ awesome] $ pour i dans `seq 5`; fait écho "Salut"; fait 
 Salut 
 Salut 
 Salut 
 Salut 
 Salut
13
John T

Ceci peut être paramétré et ne nécessite pas de variable temporaire, FWIW:

printf "%${N}s" | sed 's/ /blah/g'

Ou, si $N est la taille d'un tableau bash:

echo ${ARR[@]/*/blah}
11
twifkak

Vous pouvez utiliser un truc. Faire écho à une variable vide n’imprime rien. Pour que vous puissiez écrire:

echo Word$wojek{1..100}

Si $wojek1 $wojek2 ... $wojek100 sont des variables non existantes, votre mot sera répété 100 fois sans rien d'autre.

9
Wojciech Waga

Peut-être une autre manière plus générale et utile pour vous:

adrian@Fourier:~$ n=5
adrian@Fourier:~$ for (( c=1; c<=n; c++)) ; do echo "HelloWorld" ; done
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$ 

Le shell bash est plus puissant que la plupart des gens pensent :)

9
Adrian Petrescu

Répétez n fois, il suffit de mettre n-1 entre {}:

$ echo 'helloworld'{,,}
helloworld helloworld helloworld

Répète "helloworld" deux fois après le premier écho.

7
kev
awk 'BEGIN {while (c++<4) printf "Hello"}'

Résultat

Bonjour bonjour bonjour bonjour
5
Steven Penny

basé sur ce que @pike faisait allusion à

pour chaque caractère d'une chaîne chaîne d'écho

echo ${target//?/$replace}

Exemple d'en-tête souligné avec = caractères

export heading='ABCDEF'; 
export replace='='; 
echo -e "${heading}\n${heading//?/$replace}"

va sortir

ABCDEF
======

Cela semble porter entre Linux et OS X et cela me rend heureux.

nonJoy!

3
nickl-

J'ai rencontré des alarmes de pipe cassées avec la solution yes, alors voici une autre bonne alternative:

$ seq 4 | sed "c foo"
foo
foo
foo
foo
3
n.caillou

Si vous utilisez BSD, vous pouvez simplement utiliser seq.

$ seq -f "Hello, world" 5
Hello, world
Hello, world
Hello, world
Hello, world
Hello, world
3
Qix

Pas exactement intégré à linux, mais si vous avez installé python ..

python
>>>var = "string"
>>>var*n

Ou en une ligne, comme l'a suggéré le commentateur:

python -c 'print "This is a test.\n" * 10'
2
eqzx

En supposant que vous souhaitiez quelque chose comme l'opérateur x de Perl, dans lequel vous n'obtenez pas automatiquement une nouvelle ligne entre les répétitions:

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

J'ai explicitement utilisé une boucle for car vous ne pouvez pas écrire {1..$n} dans bash: le développement d'accolade est effectué avant la substitution de variable.

2
glenn jackman
line="==========================="
line=${line:0:10}
${line//"="/"ten "}

les sorties

ten ten ten ten ten ten ten ten ten ten
2
commonpike

Pas de magie ici:

seq 5 | awk '{print "Hello World"}'

1
brablc

Essaye celui-là:

echo $(for i in $(seq 1 100); do printf "-"; done)

Va créer (cent tirets):


1
Alle Aldine