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 10
Ceci 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"
done
Cela équivaut à:
for i in 1 2 3 4 5
Voici 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 helloworld
Ré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, world
seq (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 ten
En 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' 3
J'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*n
Ou 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):