2010-05-24 2 views
6

Ich versuche, die Version aus einem Paketnamen mit nur Bash zu entfernen. Ich habe eine Lösung, aber ich denke nicht, dass das die beste Lösung ist, also würde ich gerne wissen, ob es einen besseren Weg dafür gibt. mit besser ich meine sauberer, einfacher zu verstehen.Strip-Version von Paketname mit Bash

Angenommen, ich habe die Zeichenfolge "my-program-1.0" und ich möchte nur "mein-Programm". Meine aktuelle Lösung ist:

#!/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` 

tatsächlich, der „Paketname“ Syntax ist ein RPM Dateiname, wenn es darauf ankommt.

danke!

+1

wie etwa laufen dachte es 'sed„s/[-0-9.] * $ // "'? – BCS

+0

@BCS: Oder etwas ein wenig vorsichtiger; Ihr passt zum Beispiel gegen 'program-name-3 ... 4--789' oder realistischer gegen' program-name2-1.0' (streichen auch die 2 falsch ab). – Cascabel

+0

Beachten Sie, dass die Version * auch Buchstaben enthalten darf. –

Antwort

7

Ziemlich gut geeignet, um 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]\+\)*$//') 

Das zweite Spiel stellt sicher, dass die Versionsnummer einer Folge von Zahlen, die durch Punkte (zB X, XX getrennt ist, XXX, ...).

Edit: Es gibt also alle Kommentare basierend auf der Tatsache, dass der Begriff der Versionsnummer nicht sehr gut definiert ist. Sie müssen eine Regex für die Eingabe schreiben, die Sie erwarten. Hoffentlich haben Sie nichts so schrecklich wie "Programm-Name-1.2.3-a". Wenn ich keine zusätzliche Anfrage vom OP bekomme, denke ich, dass alle Antworten hier gut genug sind.

+0

Könnte die zweite Version testen. ;-) –

+0

@Jon Ericson: Ich habe es getan. Funktioniert wie erwartet für name-X, name-XX, name-X.X, name-X.X.X und verschiedene andere Permutationen. Es lehnt ab, alles zu ersetzen, das nicht eine korrekt formatierte Versionsnummer ist, wie 'name-X.'. Ist das nicht das gewünschte Verhalten? – Cascabel

+0

Auf meiner Box: '$ echo my-program-1.0 | sed 's/- [0-9] \ + \ (\. [0-9] \ + \) * $ //' 'erzeugt' my-program-1.0' Gemäß der Dokumentation wird sed nicht unterstützt die '+' Syntax. –

1

Wie wäre:

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

Nitpicky Details: Dies wird mit 'Programm-.' aber nicht mit 'Programm-1.2.3' übereinstimmen. – Cascabel

+0

@Jefromi: Nicht mehr. ;-) Perls RE-Syntax sieht viel schöner aus. –

+0

Ja, perl >> sed. War nur versucht, die Dinge einfach zu halten ... +1. – Cascabel

2

Bash:

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

Erzeugt "my-Programm"

Oder

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 

Erzeugt "alsa-lib"

+0

Das erste ist korrekt, da es die Tatsache ausnutzt, dass die Version niemals einen Bindestrich haben kann. Die zweite ist nicht, da Teile des Namens mit einer Ziffer beginnen können. –

+0

@Ignacio: Wahr, es müsste ein Name wie "abc-2def-1.0.42-2.foo.i286.rpm" sein, der fälschlicherweise "abc" würde. –