2010-05-24 10 views
6

Próbuję usunąć wersję z nazwy pakietu za pomocą tylko Bash. Mam jedno rozwiązanie, ale nie sądzę, że jest to najlepsze rozwiązanie, więc chciałbym się dowiedzieć, czy jest lepszy sposób na zrobienie tego. przez lepsze rozumiem czystsze, łatwiejsze do zrozumienia.wersja taśmy z nazwy pakietu przy użyciu Bash

Załóżmy, że mam ciąg "my-program-1.0" i chcę tylko "mój program". moje obecne rozwiązanie to:

#!/bin/bash 

PROGRAM_FULL="my-program-1.0" 
INDEX_OF_LAST_CHARACTER=`awk '{print match($0, "[A-Za-z0-9]-[0-9]")} <<< $PROGRAM_FULL` 
PROGRAM_NAME=`cut -c -$INDEX_OF_LAST_CHARACTER <<< $PROGRAM_FULL` 

W rzeczywistości składnia "nazwa pakietu" jest nazwą pliku RPM, jeśli ma to znaczenie.

dziękuję!

+1

jak o perspektywie Przypuszcza 'sed„s/[-0-9.] * $ // "'? – BCS

+0

@BCS: Albo coś trochę bardziej ostrożnego; twoje mecze z 'program-name-3 ... 4--789', na przykład, lub bardziej realistycznie, przeciwko' program-name2-1.0' (niepoprawnie usuwa także 2). – Cascabel

+0

Zwróć uwagę, że wersja * może * zawierać również litery. –

Odpowiedz

7

Bardzo dobrze nadaje się do sed:

# Using your matching criterion (first hyphen with a number after it 
PROGRAM_NAME=$(echo "$PROGRAM_FULL" | sed 's/-[0-9].*//') 

# Using a stronger match 
PROGRAM_NAME=$(echo "$PROGRAM_FULL" | sed 's/-[0-9]\+\(\.[0-9]\+\)*$//') 

zapewnia Drugi dopasowaniem numer wersji, jest sekwencja liczb rozdzielonych kropkami (na przykład X, XX, XXX, ...).

Edycja: Istnieją zatem komentarze na podstawie faktu, że pojęcie numeru wersji nie jest bardzo dobrze zdefiniowane. Będziesz musiał napisać wyrażenie regularne dla oczekiwanego wejścia. Mam nadzieję, że nie będziesz miał nic tak okropnego jak "program-name-1.2.3-a". Wobec braku jakiejkolwiek dodatkowej prośby z PO, myślę, że wszystkie odpowiedzi tutaj są wystarczająco dobre.

+0

Może chcę przetestować drugą wersję. ;-) –

+0

@Jon Ericson: Zrobiłem. Działa zgodnie z oczekiwaniami dla 'name-X',' name-XX', 'name-X.X',' name-X.X.X' oraz innych innych permutacji. Nie zastępuje niczego, co nie jest poprawnie sformatowanym numerem wersji, jak 'name-X'. Czy nie jest to pożądane zachowanie? – Cascabel

+0

Na moim pudełku: '$ echo my-program-1.0 | sed 's/- [0-9] \ + \ (\. [0-9] \ + \) * $ // '' produkuje 'my-program-1.0' Zgodnie z dokumentacją, sed nie obsługuje składnia '+ '. –

1

Jak o:

$ echo my-program-1.0 | perl -pne 's/-[0-9]+(\.[0-9]+)+$//' 
my-program 
+0

Szczegóły Nitpicky: to będzie pasować do 'program-.', ale nie do' programu-1.2.3'. – Cascabel

+0

@Jefromi: Już nie. ;-) Perlowska składnia RE wygląda o wiele ładniej. –

+0

Tak, perl >> sed. Starałem się, aby wszystko było proste ... +1. – Cascabel

2

Bash:

program_full="my-program-1.0" 
program_name=${program_full%-*} # remove the last hyphen and everything after 

Produkuje "my-program"

Albo

program_full="alsa-lib-1.0.17-1.el5.i386.rpm" 
program_name=${program_full%%-[0-9]*} # remove the first hyphen followed by a digit and everything after 

Produkuje "alsa-lib"

+0

Pierwsza jest prawidłowa, ponieważ wykorzystuje fakt, że wersja nigdy nie może mieć łącznika. Drugi nie jest, ponieważ części nazwy mogą zaczynać się od cyfry. –

+0

@Ignacio: To prawda, że ​​musi to być nazwa typu "abc-2def-1.0.42-2.foo.i286.rpm", która niepoprawnie stanie się "abc". –

Powiązane problemy