Com bash
, zsh
e ksh93
, você pode usar { start..end..step} formulário de expansão de chaves :
$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
Eu sei o comando seq
para gerar uma sequência de inteiros, um por linha, mas gostaria de fazer duas perguntas:
É possível escrever os números da sequência na mesma linha?
É possível criar uma string feita com a sequência de números separados por um espaço em branco?
Com bash
, zsh
e ksh93
, você pode usar { start..end..step} formulário de expansão de chaves :
$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
O GNU seq
toma a opção de separador ( -s
):
$ seq -s ' ' 1 5
1 2 3 4 5
$ var="$(seq -s ' ' 1 5)"
$ echo "$var"
1 2 3 4 5
Portátil para todos os shells e qualquer sistema que tenha seq (como estas questões são marcadas)
Se o início for 1:
$ echo $(seq 10)
1 2 3 4 5 6 7 8 9 10
Caso contrário:
$ echo $(seq 5 10)
5 6 7 8 9 10
com bc:
$ echo $(echo "for (i=0;i<=1000;i++) i"| bc)
No bash
echo {1..10}
Esta solução de eco funciona se o valor do IFS contiver uma nova linha, o que faz por padrão.
Por padrão, o IFS é definido para a sequência
Under bash, zsh, ksh just use: IFS=$' \t\n' (skip all the rest of this answer).
No entanto, redefinir o valor do IFS sob sh pode ser complexo Leia os detalhes completos aqui .
$ unset IFS; echo $(seq 5 10) #Always work.
sempre funcionará. Desde que não haja nenhum código abaixo (ou scripts filhos) que precisem do IFS configurado, como um script que use OldIFS="$IFS"
.
Usando os truques truque para sh:
sh -c 'IFS="$(printf " \t\nx")"; IFS="${IFS%x}"; printf "$IFS"|xxd' # correct.
Use isto:
string="$(seq -s " " 1 10)"
seq 10 |xargs
... ou ...
seq 10 |paste -s -
Ambos os comandos acima separarão os números inteiros por espaço em branco. xargs
usa como padrão a imitação de /bin/echo
e, portanto, cada número inteiro é separado por um único espaço. Por padrão, ele terá um tamanho máximo de linha de comando de 128K. Você pode ajustar isso ...
seq 100000 | xargs -s2093009 | wc -l
... imprime 1. Eu o valor para -s
aqui não é arbitrário - eu obtive depois de tentar um valor mais alto (o que aparentemente funcionou mesmo assim) mas depois xargs
imprimiu o mensagem útil:
-s value should be <2093010
paste
é um dos dois (que eu saiba) utilitários sancionados com POSIX para manipular linhas de tamanho arbitrário:
paste
specification application usage:Most of the standard utilities work on text files. The
cut
utility can be used to turn files with arbitrary line lengths into a set of text files containing the same data. Thepaste
utility can be used to create (or recreate) files with arbitrary line lengths.A file that contains characters organized into zero or more lines. The lines do not contain NUL characters and none can exceed
{LINE_MAX}
bytes in length, including the\n
ewline character. Although POSIX.1-2008 does not distinguish between text files and binary files (see the ISO C standard), many utilities only produce predictable or meaningful output when operating on text files. The standard utilities that have such restrictions always specify text files in their STDIN or INPUT FILES sections.
paste
é padronizado para um delimitador de tabulação e, portanto, haverá uma tabulação entre cada número inteiro após o segundo comando. Você pode ...
seq 10 |paste -sd ' ' -
... use a opção -d
elimitador para alterar esse comportamento,