Я пытаюсь разделить версию из имени пакета с помощью только Bash. У меня есть одно решение, но я не думаю, что это - лучшее доступное, таким образом, я хотел бы знать, существует ли лучший способ сделать это. лучше я имею в виду инструмент для очистки, легче понять.
предположите, что у меня есть строка "my-program-1.0", и я хочу только "мою-программу". мое текущее решение:
#!/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`
на самом деле "синтаксис" имени пакета является именем файла об/мин, если он имеет значение.
спасибо!
Довольно хорошо подходит для 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]\+\)*$//')
Второе соответствие гарантирует, что номер версии представляет собой последовательность чисел, разделенных точками (например, X, X.X.X, X.X.X, ...).
Edit: Итак, везде есть комментарии, основанные на том, что понятие номера версии не очень хорошо определено. Вам придется написать regex для ожидаемого ввода. Надеюсь, у вас не будет ничего такого ужасного, как "program-name-1.2.3-a". Однако, если у ОП нет дополнительных запросов, я думаю, что все ответы здесь достаточно хороши.
Bash:
program_full="my-program-1.0"
program_name=${program_full%-*} # remove the last hyphen and everything after
Производит «my-program»
Или
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
Производит «alsa-lib»
Как насчет:
$ echo my-program-1.0 | perl -pne 's/-[0-9]+(\.[0-9]+)+$//'
my-program