it-swarm-eu.dev

Comando Linux per ripetere una stringa n volte

C'è un comando Linux incorporato che permette di generare una stringa che è n volte una stringa di input ??

67
GetFree
[email protected]:~$ printf 'HelloWorld\n%.0s' {1..5}
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
[email protected]:~$
70
Adrian Petrescu

Ecco un modo antiquato che è abbastanza portatile:

yes "HelloWorld" | head -n 10

Questa è una versione più convenzionale di Adrian Petrescu's risposta usando l'espansione brace:

for i in {1..5}
do
    echo "HelloWorld"
done

Questo è equivalente 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}
67

Parecchi buoni modi già menzionati. Non posso dimenticare il buon vecchio seq anche se:

[john @ awesome] $ per i in `seq 5`; fai eco "Ciao"; fatto 
 Ciao 
 Ciao 
 Ciao 
 Ciao 
 Ciao
13
John T

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}
11
twifkak

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 non esistenti, la tua Parola verrà ripetuta 100 volte senza altro.

9
Wojciech Waga

Forse un altro modo che è più generale e utile per te:

[email protected]:~$ n=5
[email protected]:~$ for (( c=1; c<=n; c++)) ; do echo "HelloWorld" ; done
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
[email protected]:~$ 

La shell di bash è più potente di quanto la maggior parte della gente pensi :)

9
Adrian Petrescu

Ripeti n volte, inserisci solo n-1 virgole tra {}:

$ echo 'helloworld'{,,}
helloworld helloworld helloworld

Ripete "helloworld" due volte dopo il primo eco.

7
kev
awk 'BEGIN {while (c++<4) printf "Hello"}'

Risultato

Ciao ciao ciao ciao
5
Steven Penny

in base a ciò che @pike stava suggerendo

per ogni carattere nella stringa stringa echo

echo ${target//?/$replace}

Un esempio di intestazione sottolineata con caratteri =

export heading='ABCDEF'; 
export replace='='; 
echo -e "${heading}\n${heading//?/$replace}"

uscirà

ABCDEF
======

Questo sembra portarsi tra linux e OS X e questo mi rende felice.

nJoy!

3
nickl-

Ho riscontrato avvertimenti di pipe non funzionanti con la soluzione yes, quindi ecco un'altra buona alternativa:

$ seq 4 | sed "c foo"
foo
foo
foo
foo
3
n.caillou

Se sei su BSD, puoi semplicemente usare seq.

$ seq -f "Hello, world" 5
Hello, world
Hello, world
Hello, world
Hello, world
Hello, world
3
Qix

Non esattamente integrato in Linux, ma se hai python installato ...

python
>>>var = "string"
>>>var*n

O in una riga, come suggerito dal commentatore:

python -c 'print "This is a test.\n" * 10'
2
eqzx

Supponendo che tu voglia qualcosa come l'operatore x di Perl, in cui non ottieni 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 ciclo for perché non è possibile scrivere {1..$n} in bash: l'espansione della brace viene eseguita prima della sostituzione della variabile.

2
glenn jackman
line="==========================="
line=${line:0:10}
${line//"="/"ten "}

uscite

ten ten ten ten ten ten ten ten ten ten
2
commonpike

Nessuna magia qui:

seq 5 | awk '{print "Hello World"}'

1
brablc

Prova questo:

echo $(for i in $(seq 1 100); do printf "-"; done)

Creerà (un centinaio di trattini):


1
Alle Aldine