Preciso classificar a lista a seguir com um script de shell e fazer com que a versão mais recente apareça na parte inferior ou superior. Como eu faria isso apenas com ferramentas de shell?
release-5.0.0.rc1
release-5.0.0.rc2
release-5.0.0
release-5.0.1
release-5.0.10
release-5.0.11
release-5.0.13
release-5.0.14
release-5.0.15
release-5.0.16
release-5.0.17
release-5.0.18
release-5.0.19
release-5.0.2
release-5.0.20
release-5.0.21
release-5.0.22
release-5.0.23
release-5.0.24
release-5.0.25
release-5.0.26
release-5.0.27
release-5.0.28
release-5.0.29
release-5.0.3
printf '%s\n' ${(on)array}
emzsh
. (quando a lista estiver na$array
matriz).Respostas:
A classificação GNU tem
-V
que pode lidar principalmente com uma lista como essa ( detalhes ):No entanto, essas
.rc*
versões podem ser um pouco problemáticas, pois provavelmente devem ser classificadas antes da versão não-rc correspondente, se houver as duas, ou seja. Alguns sistemas de controle de versão (como o Debian) usam sufixos começando com um til (~
) para marcar os pré-lançamentos e são classificados antes da versão sem sufixo, que são classificados antes das versões com outros sufixos. Aparentemente, isso é suportado pelo menossort
no meu sistema, como mostrado acima (sort (GNU coreutils) 8.23
).fonte
-V
também suportado por padrãosort
no OpenBSD, mas não no NetBSD.Confira
sort -V
:Os números de versão são bestas complicadas, com muito poucos padrões que regem as partes alfabéticas, mas tente isso com seus dados reais e verifique se são suficientes.
fonte
mayorNumber–minorNumer some text
, onde a classificação do campo falha devido ao delimitador unicode. Obrigado pela dica!Isso pode ser feito como uma linha, mas dividida em várias linhas (nos tubos) aqui para facilitar a leitura, e também lida com os
rc
.Se você não tem uma
-V
opção para sua classificação, ou mesmo se tiver, precisará lidar com as ocasionaisrc
:As primeiras
sed
tiras os caracteres não-numéricosOs
sort
usa um.
delimitador (-t.
), classificação numérica (-n
), e as teclas (-k
)As finais
sed
coloca os caracteres não numéricos de volta no lugar.fonte
Obrigado por toda a inspiração - posso propor minha própria resposta: O programa de classificação pode ser levado a fazer o que é necessário. No final, trata-se de adicionar um quarto número ao controle de versão de três dígitos, classificá-lo e removê-lo novamente. Funciona - solução mais simples até agora, IMHO.
resultado:
fonte
fonte