Existe algum comando interno do Linux que permita gerar uma string n vezes uma string de entrada?
linux
command-line
bash
shell
text-manipulation
Liberta-te
fonte
fonte
Respostas:
fonte
printf
é que ele aplicará repetidamente argumentos em excesso à string de formato, "fazendo loop" gratuitamente. Por "excesso", quero dizer que existem mais argumentos do que%
espaços reservados.Aqui está uma maneira antiquada que é bastante portátil:
Esta é uma versão mais convencional da resposta de Adrian Petrescu usando a expansão de chaves:
Isso é equivalente a:
Esta é uma versão um pouco mais concisa e dinâmica da resposta de pike :
fonte
sed -n 'H;${x;s/\n//gp}'
oused -n ':t;${s/\n//gp};N;bt'
outra é fazer oecho $(yes "HelloWorld" | head -n 10)
que adiciona um espaço entre cada cópia da string. Ainda outra maneira é canalizá-lo através dotr -d '\n'
qual também elimina a nova linha final.yes
solução era exatamente o que eu precisava, pois queria duplicar um comando (cuja saída varia). Assim:yes "$(my-command)" | head -n 2
Isso pode ser parametrizado e não requer uma variável temp, FWIW:
Ou, se
$N
é o tamanho de uma matriz bash:fonte
seq
,yes
e{1..5}
não são POSIX 7.printf
especificador de formato. E se os dados contiverem seqüências de caracteres de formato? Esta é a maneira correta de especificar dinamicamente a "precisão" (comprimento):printf '%*s' "$N"
- crie o hábito de incluir a seqüência de caracteres de formato entre aspas simples para impedir a expansão de variáveis lá.Algumas boas maneiras já mencionadas. Não se pode esquecer os bons velhos
seq
tempos:fonte
{i..j}
truque nunca retorna uma faixa vazia.)Talvez outra maneira que seja mais geral e útil para você:
O shell bash é mais poderoso do que a maioria das pessoas pensa :)
fonte
yes
,printf
,for i in {1..5}
) que se on
é zero, ele retorna string vazia, sem existir estatuto de 1. Também devido à notação matemática para comparação, é fácil ter compensado por 1 (por exemplo, mudando o<=
para<
)Você pode usar um truque. Fazer eco de uma variável vazia não imprime nada. Então você pode escrever:
Se
$wojek1 $wojek2
...$wojek100
são variáveis inexistentes, você repetirá sua palavra 100 vezes sem mais nada.fonte
$_
vez de$wojek
torne a intenção mais clara.Repita os
n
tempos, basta colocarn-1
vírgulas entre{}
:Repete 'helloworld' duas vezes após o primeiro eco.
fonte
n
de uma variável?Resultado
fonte
Eu experimentei avisos de tubos quebrados com a
yes
solução, então aqui está outra boa alternativa:fonte
com base no que @pike estava sugerindo
para cada caractere na string eco da string
Um exemplo de cabeçalho sublinhado com
=
caracteresirá produzir
Isso parece estar entre o linux e o OS X e isso me deixa feliz.
nJoy!
fonte
Se você está no BSD, pode simplesmente usar
seq
.fonte
seq (GNU coreutils) 8.25
, isso forneceseq: format 'Hello, world' has no % directive
, forçando uma diretiva de formatação para estar presente. Coreutils GNU são usados, por exemplo, em muitas distribuições Linux e Cygwin. Incluindo a informação aqui para aqueles que não possuem a informação de que ela funciona apenas no BSD seq.saídas
fonte
Supondo que você queira algo como o
x
operador de Perl , onde você não obtém automaticamente uma nova linha entre repetições:Eu usei explicitamente um
for
loop porque você não pode escrever{1..$n}
no bash: a expansão de chaves é feita antes da substituição de variáveis.fonte
Não é exatamente embutido no linux, mas se você tem o python instalado ..
Ou em uma linha, como sugeriu o comentarista:
fonte
Não há mágica aqui:
seq 5 | awk '{print "Hello World"}'
fonte
Tente este:
Criará (cem traços):
fonte