Esiste un comando Linux incorporato che consente di emettere una stringa che è n volte una stringa di input ??
Esiste un comando Linux incorporato che consente di emettere una stringa che è n volte una stringa di input ??
Risposte:
adrian@Fourier:~$ printf 'HelloWorld\n%.0s' {1..5}
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$
printfè che applicherà ripetutamente argomenti in eccesso alla stringa di formato, "loop" gratuitamente. Per "eccesso" intendo che ci sono più argomenti che %segnaposto.
Ecco un modo vecchio stile che è abbastanza portatile:
yes "HelloWorld" | head -n 10
Questa è una versione più convenzionale della risposta di Adrian Petrescu usando l'espansione del controvento:
for i in {1..5}
do
echo "HelloWorld"
done
Ciò equivale a:
for i in 1 2 3 4 5
Questa è una versione un po 'più concisa e dinamica della risposta di Pike:
printf -v spaces '%*s' 10 ''; printf '%s\n' ${spaces// /ten}
sed -n 'H;${x;s/\n//gp}'o sed -n ':t;${s/\n//gp};N;bt'un altro è fare ciò echo $(yes "HelloWorld" | head -n 10)che aggiunge uno spazio tra ogni copia della stringa. Ancora un altro modo è quello di convogliarlo, tr -d '\n'eliminando anche la nuova riga finale.
yessoluzione era esattamente ciò di cui avevo bisogno, poiché volevo duplicare un comando (il cui output oscilla). Quindi:yes "$(my-command)" | head -n 2
Questo può essere parametrizzato e non richiede una variabile temporanea, FWIW:
printf "%${N}s" | sed 's/ /blah/g'
Oppure, se $Nè la dimensione di un array bash:
echo ${ARR[@]/*/blah}
seq, yese {1..5}non sono POSIX 7.
printfnell'identificatore di formato. Cosa succede se i dati contengono stringhe di formato? Questo è il modo corretto di specificare dinamicamente la "precisione" (lunghezza): printf '%*s' "$N"- prendere l'abitudine di racchiudere la stringa di formato tra virgolette singole per impedire l'espansione variabile lì.
Parecchi buoni modi già menzionati. Non posso dimenticare il buon vecchio seqperò:
[john @ awesome] $ for i in `seq 5`; fai eco "Ciao"; fatto Ciao Ciao Ciao Ciao Ciao
{i..j}trucco non restituisce mai un intervallo vuoto.)
Forse un altro modo che è più generale e utile per te:
adrian@Fourier:~$ n=5
adrian@Fourier:~$ for (( c=1; c<=n; c++)) ; do echo "HelloWorld" ; done
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$
La shell bash è più potente di quanto la maggior parte della gente pensi :)
yes, printf, for i in {1..5}) che se l' nè zero, restituisce stringa vuota senza esiste lo stato di 1. Anche a causa della notazione matematica per il confronto, è facile avere compensato da 1 (ad esempio modificando la <=a <)
Puoi usare un trucco. L'eco di una variabile vuota non stampa nulla. Quindi puoi scrivere:
echo word$wojek{1..100}
Se $wojek1 $wojek2... $wojek100sono variabili inesistenti, la parola verrà ripetuta 100 volte senza nient'altro.
$_invece di $wojekrendere più chiaro l'intento.
Ripeti i ntempi, inserisci solo le n-1virgole tra {}:
$ echo 'helloworld'{,,}
helloworld helloworld helloworld
Ripete "helloworld" due volte dopo la prima eco.
nda una variabile?
awk 'BEGIN {while (c++<4) printf "Hello"}'
Risultato
Ciao ciao ciao ciao
basato su ciò che @pike stava suggerendo
per ogni carattere nella stringa echo string
echo ${target//?/$replace}
Un esempio di intestazione sottolineata da =caratteri
export heading='ABCDEF';
export replace='=';
echo -e "${heading}\n${heading//?/$replace}"
uscirà
ABCDEF
======
Questo sembra port tra Linux e OS X e questo mi rende felice.
nJoy!
Se sei su BSD, puoi semplicemente usare seq.
$ seq -f "Hello, world" 5
Hello, world
Hello, world
Hello, world
Hello, world
Hello, world
seq (GNU coreutils) 8.25, questo dà seq: format 'Hello, world' has no % directive, forzando la presenza di una direttiva di formattazione. I coreutils GNU sono usati, ad esempio, in molte distribuzioni Linux e Cygwin. Includendo le informazioni qui per coloro che non hanno le informazioni che funzionano solo in BSD seq.
line="==========================="
line=${line:0:10}
${line//"="/"ten "}
uscite
ten ten ten ten ten ten ten ten ten ten
Supponendo di voler qualcosa come l' xoperatore di Perl , in cui non si ottiene automaticamente una nuova riga tra le ripetizioni:
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
Ho usato esplicitamente un forciclo perché non è possibile scrivere {1..$n}in bash: l'espansione del controvento viene eseguita prima della sostituzione delle variabili.
Non esattamente integrato in Linux, ma se hai installato Python ..
python
>>>var = "string"
>>>var*n
O in una riga, come suggerito dal commentatore:
python -c 'print "This is a test.\n" * 10'
Prova questo:
echo $(for i in $(seq 1 100); do printf "-"; done)
Creerà (cento trattini):