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?
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?
Réponses:
adrian@Fourier:~$ printf 'HelloWorld\n%.0s' {1..5}
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$printfc'est qu'il appliquera de manière répétée des arguments en excès à la chaîne de formatage, "en boucle" gratuitement. Par "excès", je veux dire qu'il y a plus d'arguments que de caractères %génériques.
                    Voici une manière démodée qui est assez portable:
yes "HelloWorld" | head -n 10Ceci est une version plus conventionnelle de la réponse d' Adrian Petrescu en utilisant une extension d'accolade:
for i in {1..5}
do
    echo "HelloWorld"
doneCela équivaut à:
for i in 1 2 3 4 5Voici une version un peu plus concise et dynamique de la réponse de pike :
printf -v spaces '%*s' 10 ''; printf '%s\n' ${spaces// /ten}sed -n 'H;${x;s/\n//gp}'ou sed -n ':t;${s/\n//gp};N;bt'une autre consiste à echo $(yes "HelloWorld" | head -n 10)ajouter un espace entre chaque copie de la chaîne. Une autre méthode consiste à diriger le message à travers tr -d '\n'ce qui élimine également la nouvelle ligne finale.
                    yessolution était exactement ce dont j'avais besoin, car je voulais dupliquer une commande (dont le résultat fluctue). Ainsi:yes "$(my-command)" | head -n 2
                    Ceci peut être paramétré et ne nécessite pas de variable temporaire, FWIW:
printf "%${N}s" | sed 's/ /blah/g'Ou, si $Nest la taille d'un tableau bash:
echo ${ARR[@]/*/blah}seq, yeset {1..5}ne sont pas 7. POSIX
                    printfle spécificateur de format de. Et si les données contiennent des chaînes de format? C'est la bonne façon de spécifier dynamiquement la "précision" (longueur): printf '%*s'  "$N"- prenez l'habitude de mettre la chaîne de format entre guillemets simples pour empêcher le développement de variables à cet endroit.
                    Quelques bonnes manières déjà mentionnées. Je ne peux pas oublier le bon vieux seqsi:
[john @ awesome] $ pour i dans `seq 5`; echo "Salut" fait salut salut salut salut salut
{i..j}astuce ne retourne jamais une plage vide.)
                    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 :)
yes, printf, for i in {1..5}) que si le nest égal à zéro, elle renvoie une chaîne vide , sans statut existe 1. Aussi en raison de la notation mathématique de comparaison, il est facile d'avoir compensé par 1 (par exemple en changeant la <=à <)
                    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... $wojek100sont des variables non existantes, votre mot sera répété 100 fois sans rien d'autre.
$_plutôt que de $wojekrendre l'intention plus claire.
                    Répétez nfois, il suffit de mettre des n-1virgules entre {}:
$ echo 'helloworld'{,,}
helloworld helloworld helloworldRépète "helloworld" deux fois après le premier écho.
nune variable?
                    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}Un exemple de rubrique soulignée de =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!
Si vous êtes sur BSD, vous pouvez simplement utiliser seq.
$ seq -f "Hello, world" 5
Hello, world
Hello, world
Hello, world
Hello, world
Hello, worldseq (GNU coreutils) 8.25, cela donne seq: format 'Hello, world' has no % directive, obligeant une directive de formatage à être présent. Les coreutils GNU sont utilisés, par exemple dans de nombreuses distributions Linux et Cygwin. Y compris l'info ici pour ceux qui manquent l'info qu'il fonctionne uniquement dans BSD seq.
                    line="==========================="
line=${line:0:10}
${line//"="/"ten "}les sorties
ten ten ten ten ten ten ten ten ten tenEn supposant que vous souhaitiez quelque chose comme l' xopérateur Perl , où vous ne recevez pas automatiquement de 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' 3J'ai explicitement utilisé une forboucle parce que vous ne pouvez pas écrire {1..$n}dans bash: le développement d'accolade est effectué avant la substitution de variable.
Pas exactement intégré à linux, mais si vous avez installé python ..
python
>>>var = "string"
>>>var*nOu en une ligne, comme l'a suggéré le commentateur:
python -c 'print "This is a test.\n" * 10'Essaye celui-là:
echo $(for i in $(seq 1 100); do printf "-"; done)Va créer (cent tirets):