Comando Linux para repetir uma string n vezes

58

Existe algum comando embutido do Linux que permita gerar uma string que seja n vezes uma string de entrada ??

    
por GetFree 22.12.2009 / 04:02

16 respostas

62
adrian@Fourier:~$ printf 'HelloWorld\n%.0s' {1..5}
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$
    
por 22.12.2009 / 04:08
61

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}
    
por 22.12.2009 / 04:55
12

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
    
por 22.12.2009 / 04:59
9

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:)

    
por 22.12.2009 / 04:11
9

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.

    
por 16.10.2012 / 14:49
8

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}
    
por 08.05.2012 / 03:26
7

repita n vezes, apenas coloque n-1 , em {} :

$ echo 'helloworld'{,,}
helloworld helloworld helloworld
    
por 24.12.2011 / 03:59
5
awk 'BEGIN {while (c++<4) printf "Hello"}'

Resultado

HelloHelloHelloHello
    
por 01.06.2014 / 10:33
3

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!

    
por 28.02.2013 / 18:21
3

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
    
por 15.04.2016 / 07:24
2
line="==========================="
line=${line:0:10}
${line//"="/"ten "}

saídas

ten ten ten ten ten ten ten ten ten ten
    
por 11.08.2010 / 10:21
2

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'
    
por 22.12.2009 / 04:09
2

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
    
por 16.08.2017 / 01:05
1

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.

    
por 04.07.2011 / 13:51
1

Tente este:

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

Será criado (cem traços):

por 11.07.2012 / 16:43
1

Nenhuma mágica aqui:

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

    
por 15.06.2018 / 09:46