Existe algum comando interno do Linux que permita gerar uma string n vezes uma string de entrada?
Existe algum comando interno do Linux que permita gerar uma string n vezes uma string de entrada?
Respostas:
adrian@Fourier:~$ printf 'HelloWorld\n%.0s' {1..5}
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$
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:
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 de pike :
printf -v spaces '%*s' 10 ''; printf '%s\n' ${spaces// /ten}
sed -n 'H;${x;s/\n//gp}'
ou sed -n ':t;${s/\n//gp};N;bt'
outra é fazer o echo $(yes "HelloWorld" | head -n 10)
que adiciona um espaço entre cada cópia da string. Ainda outra maneira é canalizá-lo através do tr -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:
printf "%${N}s" | sed 's/ /blah/g'
Ou, se $N
é o tamanho de uma matriz bash:
echo ${ARR[@]/*/blah}
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:
[john @ awesome] $ para i no `seq 5`; faça eco "Oi"; pronto Oi Oi Oi Oi Oi
{i..j}
truque nunca retorna uma faixa vazia.)
Talvez outra maneira 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 :)
yes
, printf
, for i in {1..5}
) que se o n
é 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:
echo word$wojek{1..100}
Se $wojek1 $wojek2
... $wojek100
são variáveis inexistentes, você repetirá sua palavra 100 vezes sem mais nada.
$_
vez de $wojek
torne a intenção mais clara.
Repita os n
tempos, basta colocar n-1
vírgulas entre {}
:
$ echo 'helloworld'{,,}
helloworld helloworld helloworld
Repete 'helloworld' duas vezes após o primeiro eco.
n
de uma variável?
awk 'BEGIN {while (c++<4) printf "Hello"}'
Resultado
Olá Olá Olá Olá
com base no que @pike estava sugerindo
para cada caractere na string eco da string
echo ${target//?/$replace}
Um exemplo de cabeçalho sublinhado com =
caracteres
export heading='ABCDEF';
export replace='=';
echo -e "${heading}\n${heading//?/$replace}"
irá produzir
ABCDEF
======
Isso parece estar entre o linux e o OS X e isso me deixa feliz.
nJoy!
Se você está no BSD, pode simplesmente usar seq
.
$ seq -f "Hello, world" 5
Hello, world
Hello, world
Hello, world
Hello, world
Hello, world
seq (GNU coreutils) 8.25
, isso fornece seq: 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.
line="==========================="
line=${line:0:10}
${line//"="/"ten "}
saídas
ten ten ten ten ten ten ten ten ten ten
Supondo que você queira algo como o x
operador de Perl , onde você não obtém automaticamente uma nova linha entre 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 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.
Não é exatamente embutido no linux, mas se você tem o python instalado ..
python
>>>var = "string"
>>>var*n
Ou em uma linha, como sugeriu o comentarista:
python -c 'print "This is a test.\n" * 10'
Tente este:
echo $(for i in $(seq 1 100); do printf "-"; done)
Criará (cem traços):