Gibt es einen integrierten Linux-Befehl, der die Ausgabe einer Zeichenfolge ermöglicht, die n-mal eine Eingabezeichenfolge ist?
Gibt es einen integrierten Linux-Befehl, der die Ausgabe einer Zeichenfolge ermöglicht, die n-mal eine Eingabezeichenfolge ist?
Antworten:
adrian@Fourier:~$ printf 'HelloWorld\n%.0s' {1..5}
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$
printf
ist , dass es immer wieder überschüssige Argumente an den Format - String, „Looping“ kostenlos an. Mit "Überschuss" meine ich, dass es mehr Argumente als %
Platzhalter gibt.
Hier ist ein altmodischer Weg, der ziemlich portabel ist:
yes "HelloWorld" | head -n 10
Dies ist eine konventionellere Version von Adrian Petrescus Antwort mit Klammererweiterung:
for i in {1..5}
do
echo "HelloWorld"
done
Das entspricht:
for i in 1 2 3 4 5
Dies ist eine etwas präzisere und dynamischere Version der Antwort von Pike :
printf -v spaces '%*s' 10 ''; printf '%s\n' ${spaces// /ten}
sed -n 'H;${x;s/\n//gp}'
oder eine sed -n ':t;${s/\n//gp};N;bt'
andere, echo $(yes "HelloWorld" | head -n 10)
die ein Leerzeichen zwischen jeder Kopie der Zeichenfolge hinzufügt. Ein weiterer Weg besteht darin, es tr -d '\n'
durchzuleiten, wodurch auch der letzte Zeilenumbruch beseitigt wird.
yes
Lösung war genau das, was ich brauchte, da ich einen Befehl duplizieren wollte (dessen Ausgabe schwankt). Also:yes "$(my-command)" | head -n 2
Dies kann parametrisiert werden und erfordert keine temporäre Variable, FWIW:
printf "%${N}s" | sed 's/ /blah/g'
Oder wenn $N
es die Größe eines Bash-Arrays hat:
echo ${ARR[@]/*/blah}
seq
, yes
und {1..5}
es handelt sich nicht um POSIX 7.
printf
den Formatbezeichner von mischen . Was ist, wenn die Daten Formatzeichenfolgen enthalten? Dies ist der richtige Weg, um die "Genauigkeit" (Länge) dynamisch anzugeben: printf '%*s' "$N"
- Machen Sie es sich zur Gewohnheit, die Formatzeichenfolge in einfache Anführungszeichen zu setzen, um eine variable Erweiterung dort zu verhindern.
Einige gute Möglichkeiten wurden bereits erwähnt. Ich kann aber nicht gut alt vergessen seq
:
[john @ awesome] $ für i in `seq 5`; mach ein Echo "Hi"; fertig Hallo Hallo Hallo Hallo Hallo
{i..j}
Trick gibt niemals einen leeren Bereich zurück.)
Vielleicht eine andere Möglichkeit, die allgemeiner und nützlicher für Sie 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 :)
yes
, printf
, for i in {1..5}
) , dass , wenn die n
Null, es leeren String zurück , ohne existieren Status 1. Auch aufgrund der mathematischen Notation zum Vergleich, ist es leicht um 1 versetzt zu haben (zB durch die Veränderung <=
zu <
)
Sie können einen Trick verwenden. Das Echo einer leeren Variablen gibt nichts aus. So können Sie schreiben:
echo word$wojek{1..100}
Wenn $wojek1 $wojek2
... $wojek100
nicht existierende Variablen sind, werden Sie Ihr Wort 100-mal ohne irgendetwas anderes wiederholen lassen.
$_
anstelle $wojek
die Absicht klarer.
Wiederholen Sie die n
Zeiten, setzen Sie einfach n-1
Kommas zwischen {}
:
$ echo 'helloworld'{,,}
helloworld helloworld helloworld
Wiederholt 'helloworld' zweimal nach dem ersten Echo.
n
von einer Variablen bekommen will ?
awk 'BEGIN {while (c++<4) printf "Hello"}'
Ergebnis
Hallo Hallo Hallo Hallo
basierend auf dem, was @pike andeutete
für jedes Zeichen in der Zeichenfolge Echo-Zeichenfolge
echo ${target//?/$replace}
Ein Beispiel für eine mit =
Zeichen unterstrichene Überschrift
export heading='ABCDEF';
export replace='=';
echo -e "${heading}\n${heading//?/$replace}"
wird ausgegeben
ABCDEF
======
Dies scheint zwischen Linux und OS X zu portieren und das freut mich.
nJoy!
Wenn Sie auf BSD sind, können Sie nur verwenden seq
.
$ seq -f "Hello, world" 5
Hello, world
Hello, world
Hello, world
Hello, world
Hello, world
seq (GNU coreutils) 8.25
ergibt dies seq: format 'Hello, world' has no % directive
eine Formatierung Richtlinie zwingt anwesend zu sein. GNU-Coreutils werden zB in vielen Linux-Distributionen und in Cygwin verwendet. Einschließlich der Informationen hier für diejenigen, denen die Information fehlt, dass es nur in BSD-seq funktioniert.
line="==========================="
line=${line:0:10}
${line//"="/"ten "}
Ausgänge
ten ten ten ten ten ten ten ten ten ten
Angenommen, Sie möchten so etwas wie den x
Operator von Perl , bei dem Sie zwischen den Wiederholungen nicht automatisch einen Zeilenumbruch erhalten:
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
Ich habe explizit eine for
Schleife verwendet, da Sie nicht {1..$n}
in bash schreiben können : Die Erweiterung der Klammern erfolgt vor der Variablensubstitution.
Nicht unbedingt in Linux integriert, aber wenn Sie Python installiert haben.
python
>>>var = "string"
>>>var*n
Oder in einer Zeile, wie vom Kommentator vorgeschlagen:
python -c 'print "This is a test.\n" * 10'
Probier diese:
echo $(for i in $(seq 1 100); do printf "-"; done)
Wird erstellen (einhundert Bindestrich):