Talvez não seja o que você queria, mas, como você está realmente tentando inserir um valor, eu pessoalmente adicionaria o número à lista e usaria sort -n
para colocar as coisas na ordem correta.
Esse comando pode ter esta aparência (se a lista estiver em um arquivo):
echo 13 | cat listfile - | sort -n | sed '/^$/d' | cat - > listfile
(Substitua o 13 pelo número que você deseja inserir, talvez a variável x
, para que a sequência de comandos comece com echo $x |
)
Para uma explicação, vou dividir:
-
echo 13 |
gera o número 13 para stdout, que é então canalizado para o próximo comando -
cat listfile - |
primeiro pega o conteúdo do listfile, depois tudo de stdin até um EOF, e então canaliza o resultado concatenado para o próximo comando 'stdin -
sort -n |
pega a lista de canais e a classifica levando em consideração a natureza numérica da entrada (conforme fornecido pela opção -n, também verman sort
) -
sed '/^$/d' |
remove as linhas vazias da string e as encaminha novamente -
cat - > listfile
coloca a coisa toda de volta no listfile novamente. Sim, isso funciona em oposição a coisas comosed 's/a/b/g somefile > somefile'
, o que esvaziaria o arquivo.
Se você quiser dividi-lo em vários comandos, poderá tornar a coisa mais legível, sempre operando no arquivo:
echo 13 >> listfile
sort -n listfile
sed -i '/^$/d' listfile
Isso também pode ser útil se você precisar adicionar várias entradas. Basta anexá-los a todos e, em seguida, ordenar (o que pode ser mais rápido do que procurar posições de inserção a cada vez).
O comando acima também funciona se você estiver operando em variáveis. Para isso, o conteúdo do var deve estar presente como uma string usando separação de nova linha para que possa ser ordenada por linha.
Se os valores forem, por exemplo espaço separado, você poderia usar o seguinte comando
list=$(echo $list 13 | sed -r 's/\s+/\n/g' | sort -n | sed '/^$/d')
Além da atribuição de variável, o único novo comando é o primeiro sed
, que substitui qualquer sequência contígua de caracteres de espaço em branco (incluindo novas linhas) por novas linhas para criar separação de linha. Na atribuição de variáveis, a lista será automaticamente convertida de volta para a separação do espaço.