Linux-Befehl, um einen String n-mal zu wiederholen

93433
GetFree

Gibt es einen integrierten Linux-Befehl, mit dem eine Zeichenfolge ausgegeben werden kann, die n-mal eine Eingabezeichenfolge ist?

58
Mit "eingebautem Linux-Befehl" nehme ich an, Sie meinen Shell-Befehl. Da Sie nicht erwähnen, welche Shell Sie verwenden, nehme ich an, dass es bash ist. Sie können dies überprüfen, indem Sie in der Befehlszeile "echo $ SHELL" eingeben. Sie sollten etwas ähnliches wie "/ bin / bash" erhalten. Wenn Sie dies nicht tun, sollten Sie Ihre Antwort bearbeiten, um anzugeben, was angezeigt wird. Prost :) Adrian Petrescu vor 14 Jahren 1
Ich habe die Frage mit "bash" markiert. Ich dachte, das wäre genug gewesen. GetFree vor 14 Jahren 7
Siehe auch [SO]: http://stackoverflow.com/q/3211891/2157640 Palec vor 9 Jahren 1

16 Antworten auf die Frage

64
Adrian Petrescu
adrian@Fourier:~$ printf 'HelloWorld\n%.0s'  HelloWorld HelloWorld HelloWorld HelloWorld HelloWorld adrian@Fourier:~$ 
Könntest du erklären, wie das funktioniert? Ich verstehe den Befehl printf, da er mit dem in C / C ++ identisch ist. Aber ich verstehe nicht, wie erweitert wird und wie dies in Verbindung mit dem Teil "% .0s" funktioniert. GetFree vor 14 Jahren 2
Es ist ein bisschen ein Hacker :) Versuchen Sie, "printf 'HelloWorld% d \ n' 1 2 3 4 5" auszuführen, und es wird wahrscheinlich für Sie klicken. Das% .0s-Flag soll nichts tun, nur da sein, um Argumente aufzunehmen. Wenn bash mehr Argumente erhält, als es Formatspezifizierer hat, werden einfach mehrere Kopien gedruckt, und es werden so viele wie nötig benötigt. So bekommst du den Effekt. Die Ausgabe von "printf 'HelloWorld% d% d \ n' 1 2 3 4 5 6" macht es wahrscheinlich noch klarer. Hoffe das hilft! Adrian Petrescu vor 14 Jahren 3
Aha. Es ist das besondere Verhalten von printf, was die Wiederholung erlaubt GetFree vor 14 Jahren 0
(Ich sollte beachten, dass dies aus rein theoretischer Sicht wahrscheinlich die schnellste Lösung ist, da es ein Single-Shell-Primitiv verwendet - keine externen Prozesse. In Wirklichkeit ist die Performance von Bash-Skripten jedoch nicht von Belang: ) Adrian Petrescu vor 14 Jahren 1
Hinweis: Die Erweiterung von ist nicht spezifisch für printf. Dies ist eine Bash-Syntax, die zu einer Folge von Zahlen x, x + 1, ..., y erweitert wird. Versuchen Sie beispielsweise "echo ". Dies ist im Abschnitt "Brace Expansion" der bash-Manpage (und wird "Sequenzausdruck" genannt). larsks vor 14 Jahren 0
Was * spezifisch für "printf" ist, ist, dass überschüssige Argumente wiederholt auf die Formatzeichenfolge angewendet werden, und zwar kostenlos. Mit "Überschuss" meine ich, dass es mehr Argumente als Platzhalter "%" gibt. Dennis Williamson vor 12 Jahren 0
Uggh. Warum sich `bash` (POSIX?) Dafür entschieden hat, ist mir völlig überlegen. Ich bin davon gebissen worden, als ich mit meiner GRUB2-Konfiguration herumgespielt habe. new123456 vor 12 Jahren 0
Dies funktioniert nicht, wenn wir 0-mal wiederholen möchten. icando vor 11 Jahren 0
61
Dennis Williamson

Hier ist ein altmodischer Weg, der ziemlich tragbar ist:

yes "HelloWorld" | head -n 10 

Dies ist eine konventionellere Version der Antwort von Adrian Petrescu, die eine Brace-Erweiterung verwendet:

for i in  do echo "HelloWorld" done 

Das ist äquivalent zu:

for i in 1 2 3 4 5 

Dies ist eine etwas prägnantere und dynamischere Version von pikes Antwort:

printf -v spaces '%*s' 10 ''; printf '%s\n' $ 
Wie werden die neuen Zeilen mit dem Befehl yes entfernt? GetFree vor 14 Jahren 0
Eine Möglichkeit besteht darin, es durch `sed -n 'zu leiten H; $ '` oder `sed -n ': t; $ ; N; bt`` eine andere ist, `echo $ (ja" HelloWorld "| head -n 10)` zu tun, wobei zwischen jeder Kopie des Strings ein Leerzeichen eingefügt wird. Eine andere Möglichkeit besteht darin, es durch 'tr -d' \ n '' zu leiten, wodurch auch die letzte Zeile entfernt wird. Dennis Williamson vor 14 Jahren 3
Es ist wie Haskell in einer Bash-Shell: Hashell? wchargin vor 10 Jahren 1
Die Ja-Lösung ist ziemlich ordentlich piggybox vor 8 Jahren 4
Die "Ja" -Lösung war genau das, was ich brauchte, da ich einen Befehl duplizieren wollte (dessen Ausgabe schwankt). Also: `ja" $ (mein-Befehl) "| Kopf -n 2 ' arnsholt vor 7 Jahren 0
@arnsholt: Ich bin mir nicht sicher, was du mit Schwankung meinst. Die Befehlsersetzung wird nur einmal ausgeführt und "yes" gibt dasselbe (die einzige Ausgabe der Befehlsersetzung) mehrmals aus. Vergleichen Sie zum Beispiel `ja" $ (Datum +% N; Schlaf 1) "| head -n 4` und `for i in ; do date +% N; schlaf 1; fertig " Dennis Williamson vor 7 Jahren 0
Die Ausgabe basiert auf einer Zufallsstichprobe. Wenn Sie den Befehl zweimal ausführen, erhalten Sie jedes Mal etwas andere Ergebnisse. Ich wollte eigentlich genau dieselbe Zeichenfolge zweimal (weil die Ausgabe in ein Skript ging, das eine Tabelle generiert, und diese bestimmte Zeile sollte zweimal dieselbe Zahl sein [wo andere Zeilen offensichtlich variierten]). arnsholt vor 7 Jahren 0
@arnsholt: OK, ich würde eine for-Schleife verwenden, anstatt eine externe ausführbare Datei (`yes`) zu erzeugen. Oder erfassen Sie es einmal und geben Sie es zweimal aus: `out = $ (mein-Befehl); printf '% s \ n' "$ out" "$ out" `(` `` `` `` fügt nacheinander überzählige Argumente ein) oder ähnliche Techniken. Dennis Williamson vor 7 Jahren 0
12
John T

Viele gute Möglichkeiten wurden bereits erwähnt. Kann nicht über gutes altes vergessen seq:

[john @ awesome] $ für i in `seq 5`; Echo "Hi", fertig Hallo Hallo Hallo Hallo Hallo
Diese respektiert eigentlich eine Null und behandelt sie als Null! (Der Trick `` gibt niemals einen leeren Bereich zurück.) JellicleCat vor 7 Jahren 0
9
Adrian Petrescu

Vielleicht ein anderer Weg, der für Sie allgemeiner und nützlicher ist:

adrian@Fourier:~$ n=5 adrian@Fourier:~$ for (( c=1; c<=n; c++)) ; do echo "HelloWorld" ; done HelloWorld HelloWorld HelloWorld HelloWorld HelloWorld adrian@Fourier:~$  

Die Bash-Shell ist mächtiger als die meisten Leute denken :)

Das bekommt meine Stimme, da es rein innerlich ist. keine Gabelung erforderlich esm vor 14 Jahren 0
Auf welche Gabelung beziehen Sie sich? Die ursprüngliche Antwort erfordert keine. Die Ausgabe des Typs 'printf' ist 'printf ist eine eingebaute Shell' und wird daher innerhalb des ursprünglichen Bash-Prozesses ausgeführt. CodeGnome vor 12 Jahren 1
9
Wojciech Waga

You can use a trick. Echoing an empty variable does not print anything. So you can write:

echo word$wojek 

If $wojek1 $wojek2 ... $wojek100 are non-existing variables you will get your word repeated 100 times without anything else.

Es ist ein hässlicher hässlicher Hack, und trotzdem kann ich nicht anders als ihn zu lieben und ihn zu benutzen. 16807 vor 6 Jahren 1
8
twifkak

This can be parameterized and doesn't require a temp variable, FWIW:

printf "%$s" | sed 's/ /blah/g' 

Or, if $N is the size of a bash array:

echo $ 
Dies ist die kürzeste [POSIX 7] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html#tag_20_94) -Lösung, die ich seit "seq", "yes" und " `sind nicht POSIX 7. Ciro Santilli 新疆改造中心 六四事件 法轮功 vor 10 Jahren 2
7
kev

Wiederholungszeiten,n nur setzen n-1 ,in {}:

$ echo 'helloworld'{,,} helloworld helloworld helloworld 
Schön, aber was ist, wenn ich 'n' von einer Variablen bekommen möchte? GetFree vor 11 Jahren 4
es fügt nach jeder "helloworld" einen zusätzlichen Platz hinzu Seti Volkylany vor 7 Jahren 1
5
Steven Penny
awk 'BEGIN ' 

Ergebnis

Hallo Hallo Hallo Hallo 
Verwenden Sie dies ohne das awk: while ((c ++ <5)); do printf 'Hallo'; erledigt emf vor 7 Jahren 0
3
nickl-

basierend auf was @pike angedeutet hat

für jedes Zeichen in der Zeichenfolge Echozeichenfolge

echo $ 

Ein Beispiel für eine mit =Zeichen unterstrichene Überschrift

export heading='ABCDEF';  export replace='=';  echo -e "$\n$" 

wird ausgegeben

ABCDEF ====== 

Dies scheint zwischen Linux und OS X zu portieren und das macht mich glücklich.

nJoy!

3
Qix

If you're on BSD, you can just use seq.

$ seq -f "Hello, world" 5 Hello, world Hello, world Hello, world Hello, world Hello, world 
In `seq (GNU coreutils) 8.25` ergibt dies 'seq: format' Hallo, Welt 'hat keine% -Anweisung' und zwingt eine Formatierungsanweisung. GNU-Coreutils werden zB in vielen Linux-Distributionen und Cygwin verwendet. Fügen Sie hier die Informationen für diejenigen ein, denen die Informationen fehlen, dass sie nur in BSD-Sequenz funktionieren. Palec vor 6 Jahren 0