2010-05-24 2 views
6

Bash 만 사용하여 패키지 이름에서 버전을 제거하려고합니다. 나는 하나의 해결책을 가지고 있지만 그것이 최선의 방법이라고 생각지 않는다. 그래서 그것을 할 수있는 더 좋은 방법이 있는지 알고 싶다. 더 낫게 나는 깨끗하고 이해하기 쉽다는 것을 의미합니다.Bash를 사용하여 패키지 이름에서 스트립 버전

"my-program-1.0"문자열이 있다고 가정하고 "my-program"만 원한다고 가정합니다. 현재 해결 방법은 다음과 같습니다.

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

실제로 "패키지 이름"구문은 중요한 경우 RPM 파일 이름입니다.

감사합니다.

+1

"의 생산"내 프로그램 "을 생성합니다 [-0-9.] * $ // "'? – BCS

+0

@BCS : 아니면 좀 더주의해야합니다. 예를 들어'program-name-3 ... 4--789'와 비교하거나 더 현실적으로'program-name2-1.0' (2를 잘못 제거)에 대해 일치합니다. – Cascabel

+0

버전 *에 글자도있을 수 있습니다. –

답변

7

꽤 나오지에 매우 적합 :

# 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, XX을 보장 XXX, ...).

편집 : 따라서 버전 번호의 개념이 잘 정의되어 있지 않다는 사실을 바탕으로 모든 의견이 있습니다. 예상 입력에 대한 정규 표현식을 작성해야합니다. 바라건대 "program-name-1.2.3-a"만큼 끔찍하지 않을 것입니다. OP로부터의 추가 요청이 없다면, 나는 여기서 모든 대답이 충분하다고 생각한다.

+0

두 번째 버전을 테스트 할 수 있습니다. ;-) –

+0

@ 존 에릭슨 : 했어. 'name-X','name-XX','name-X.X','name-X.X.X', 그리고 다른 순열에 대해 예상대로 작동합니다. 'name-X '와 같이 형식이 올바르지 않은 것을 대체하기를 거부합니다. 그것은 바람직한 행동이 아닌가? – Cascabel

+0

제 박스에'$ echo my-program-1.0 | sed의/- [0-9] \ + \ (\. [0-9] \ + \) * $ // ''my-program-1.0'을 생성합니다. 설명서에 따르면 sed는 '+'문법. –

1

약 방법

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

Nitpicky 세부 사항 : 이것은'program-.'과 일치하지만'program-1.2.3'과는 일치하지 않습니다. – Cascabel

+0

@ 제프롬미 : 이제 더 이상. ;-) Perl의 RE 구문은 훨씬 더 멋지게 보입니다. –

+0

예, perl >> sed. 일을 단순하게 유지 하려던 참이었습니다 ... +1. – Cascabel

2

배쉬 :

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

또는

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에"실행에 대해이`나오지 생각한 방법

+0

첫 번째 버전은 버전이 하이픈을 가질 수 없다는 점을 이용하므로 정확합니다. 두 번째 부분은 이름의 일부가 숫자로 시작될 수 있기 때문에 아닙니다. –

+0

@Ignacio : 사실 "abc-2def-1.0.42-2.foo.i286.rpm"과 같은 이름이어야합니다.이 이름은 "abc"가됩니다. –

관련 문제