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?
linux
command-line
bash
shell
text-manipulation
GetFree
la source
la source
Réponses:
la source
printf
c'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:
Ceci est une version plus conventionnelle de la réponse d' Adrian Petrescu en utilisant une extension d'accolade:
Cela équivaut à:
Voici une version un peu plus concise et dynamique de la réponse de pike :
la source
sed -n 'H;${x;s/\n//gp}'
oused -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 à traverstr -d '\n'
ce qui élimine également la nouvelle ligne finale.yes
solution é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:
Ou, si
$N
est la taille d'un tableau bash:la source
seq
,yes
et{1..5}
ne sont pas 7. POSIXprintf
le 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
seq
si:la source
{i..j}
astuce ne retourne jamais une plage vide.)Peut-être une autre manière plus générale et utile pour vous:
Le shell bash est plus puissant que la plupart des gens pensent :)
la source
yes
,printf
,for i in {1..5}
) que si len
est é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:
Si
$wojek1 $wojek2
...$wojek100
sont des variables non existantes, votre mot sera répété 100 fois sans rien d'autre.la source
$_
plutôt que de$wojek
rendre l'intention plus claire.Répétez
n
fois, il suffit de mettre desn-1
virgules entre{}
:Répète "helloworld" deux fois après le premier écho.
la source
n
une variable?Résultat
la source
J'ai rencontré des avertissements de rupture de tuyau avec la
yes
solution, alors voici une autre bonne alternative:la source
basé sur ce que @pike faisait allusion à
pour chaque caractère d'une chaîne chaîne d'écho
Un exemple de rubrique soulignée de
=
caractèresva sortir
Cela semble porter entre Linux et OS X et cela me rend heureux.
NonJoy!
la source
Si vous êtes sur BSD, vous pouvez simplement utiliser
seq
.la source
seq (GNU coreutils) 8.25
, cela donneseq: 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.les sorties
la source
En supposant que vous souhaitiez quelque chose comme l'
x
opérateur Perl , où vous ne recevez pas automatiquement de nouvelle ligne entre les répétitions:J'ai explicitement utilisé une
for
boucle parce que vous ne pouvez pas écrire{1..$n}
dans bash: le développement d'accolade est effectué avant la substitution de variable.la source
Pas exactement intégré à linux, mais si vous avez installé python ..
Ou en une ligne, comme l'a suggéré le commentateur:
la source
Pas de magie ici:
seq 5 | awk '{print "Hello World"}'
la source
Essaye celui-là:
Va créer (cent tirets):
la source