adrian@Fourier:~$ printf 'HelloWorld\n%.0s' {1..5}
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$
Existe algum comando embutido do Linux que permita gerar uma string que seja n vezes uma string de entrada ??
Aqui está uma maneira antiquada que é bem portátil:
yes "HelloWorld" | head -n 10
Esta é uma versão mais convencional da resposta de Adrian Petrescu usando a expansão de chaves:
for i in {1..5}
do
echo "HelloWorld"
done
Isso é equivalente a:
for i in 1 2 3 4 5
Esta é uma versão um pouco mais concisa e dinâmica da resposta pike's :
printf -v spaces '%*s' 10 ''; printf '%s\n' ${spaces// /ten}
Algumas boas maneiras já mencionadas. Não pode esquecer o bom e velho seq
:
[john@awesome]$for i in 'seq 5'; do echo "Hi";done Hi Hi Hi Hi Hi
Talvez outra forma que seja mais geral e útil para você:
adrian@Fourier:~$ n=5
adrian@Fourier:~$ for (( c=1; c<=n; c++)) ; do echo "HelloWorld" ; done
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$
O shell bash é mais poderoso do que a maioria das pessoas pensa:)
Você pode usar um truque. Fazer eco de uma variável vazia não imprime nada. Então você pode escrever:
echo word$wojek{1..100}
Se $wojek1 $wojek2
... $wojek100
forem variáveis não existentes, sua palavra será repetida 100 vezes sem qualquer outra coisa.
Isso pode ser parametrizado e não requer uma variável temporária, FWIW:
printf "%${N}s" | sed 's/ /blah/g'
Ou, se $N
for o tamanho de uma matriz bash:
echo ${ARR[@]/*/blah}
repita n
vezes, apenas coloque n-1
,
em {}
:
$ echo 'helloworld'{,,}
helloworld helloworld helloworld
awk 'BEGIN {while (c++<4) printf "Hello"}'
Resultado
HelloHelloHelloHello
com base no que a @pike estava insinuando
para cada caractere na string echo string
echo ${target//?/$replace}
Um exemplo de cabeçalho destacado com =
caracteres
export heading='ABCDEF';
export replace='=';
echo -e "${heading}\n${heading//?/$replace}"
irá produzir
ABCDEF
======
Isso parece portar entre o Linux e o OS X e isso me deixa feliz.
nJoy!
Se você está no BSD, você pode usar apenas seq
.
$ seq -f "Hello, world" 5
Hello, world
Hello, world
Hello, world
Hello, world
Hello, world
line="==========================="
line=${line:0:10}
${line//"="/"ten "}
saídas
ten ten ten ten ten ten ten ten ten ten
Não exatamente embutido no linux, mas se você tiver o python instalado ...
python
>>>var = "string"
>>>var*n
Ou em uma linha, como comentador sugerido:
python -c 'print "This is a test.\n" * 10'
Eu experimentei avisos de canais quebrados com a solução yes
, então aqui está outra boa alternativa:
$ seq 4 | sed "c foo"
foo
foo
foo
foo
Supondo que você queira algo como o operador x
de Perl, em que você não obtém automaticamente uma nova linha entre as repetições:
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
Eu usei explicitamente um loop for
porque você não pode escrever {1..$n}
no bash: a expansão do brace é feita antes da substituição da variável.
Tente este:
echo $(for i in $(seq 1 100); do printf "-"; done)
Será criado (cem traços):
Nenhuma mágica aqui:
seq 5 | awk '{print "Hello World"}'