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.
yes
soluzione 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
, yes
e {1..5}
non sono POSIX 7.
printf
nell'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 seq
però:
[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
... $wojek100
sono variabili inesistenti, la parola verrà ripetuta 100 volte senza nient'altro.
$_
invece di $wojek
rendere più chiaro l'intento.
Ripeti i n
tempi, inserisci solo le n-1
virgole tra {}
:
$ echo 'helloworld'{,,}
helloworld helloworld helloworld
Ripete "helloworld" due volte dopo la prima eco.
n
da 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' x
operatore 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 for
ciclo 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):