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?
adrian@Fourier:~$ printf 'HelloWorld\n%.0s' {1..5}
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$
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}
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
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}
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.
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 :)
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.
awk 'BEGIN {while (c++<4) printf "Hello"}'
Résultat
Bonjour bonjour bonjour bonjour
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!
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
Si vous utilisez BSD, vous pouvez simplement utiliser seq
.
$ seq -f "Hello, world" 5
Hello, world
Hello, world
Hello, world
Hello, world
Hello, world
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'
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.
line="==========================="
line=${line:0:10}
${line//"="/"ten "}
les sorties
ten ten ten ten ten ten ten ten ten ten
Pas de magie ici:
seq 5 | awk '{print "Hello World"}'
Essaye celui-là:
echo $(for i in $(seq 1 100); do printf "-"; done)
Va créer (cent tirets):