Como posso classificar uma lista com o nível major.minor.patch e às vezes rc corretamente?
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?
— Mandragor
Veja também printf '%s\n' ${(on)array}em zsh. (quando a lista estiver na $arraymatriz).
A classificação GNU tem -Vque 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 menos sortno meu sistema, como mostrado acima ( sort (GNU coreutils) 8.23).
Me sniped por um par de segundos :)
Muito obrigado. Nem imaginava que esse tipo teria uma opção como essa.
FWIW, -Vtambém suportado por padrão sortno OpenBSD, mas não no NetBSD.
Aparentemente , o FreeBSD também parece que a página de manual também tem um exemplo de ordem de saída e parece idêntica à do OpenBSD.
— 22917 ilkkachu
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.
Uau, ótimo! Isso funciona mesmo para um problema antigo meu com nomes de arquivos 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 -Vopção para sua classificação, ou mesmo se tiver, precisará lidar com as ocasionais rc:
As primeiras sedtiras os caracteres não-numéricos
Os sortusa um .delimitador ( -t.), classificação numérica (- n), e as teclas ( -k)
As finais sedcoloca os caracteres não numéricos de volta no lugar.
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.