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:~$
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:
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.
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:
printf "%${N}s" | sed 's/ /blah/g'
Ou, si $N
est la taille d'un tableau bash:
echo ${ARR[@]/*/blah}
seq
, yes
et {1..5}
ne sont pas 7. POSIX
printf
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:
[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 n
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:
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.
$_
plutôt que de $wojek
rendre l'intention plus claire.
Répétez n
fois, il suffit de mettre des n-1
virgules entre {}
:
$ echo 'helloworld'{,,}
helloworld helloworld helloworld
Répète "helloworld" deux fois après le premier écho.
n
une 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' x
opé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 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.
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):