2010-05-24 31 views
6

Tôi đang cố gắng loại bỏ phiên bản ra khỏi tên gói chỉ sử dụng Bash. Tôi có một giải pháp nhưng tôi không nghĩ đó là giải pháp tốt nhất có sẵn, vì vậy tôi muốn biết nếu có cách nào tốt hơn để làm điều đó. bởi tốt hơn tôi có nghĩa là sạch hơn, dễ hiểu hơn.phiên bản dải từ tên gói sử dụng Bash

giả sử tôi có chuỗi "chương trình của tôi-1.0" và tôi chỉ muốn "chương trình của tôi". giải pháp hiện tại của tôi là:

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

cú pháp "tên gói" là tên tệp RPM, nếu nó quan trọng.

cảm ơn!

+1

thế nào về chạy nó nghĩ 'sed "s/[-0-9.] * $ // "'? – BCS

+0

@BCS: Hoặc điều gì đó cẩn thận hơn một chút; của bạn phù hợp với 'program-name-3 ... 4--789', ví dụ, hoặc thực tế hơn, chống lại' program-name2-1.0' (không chính xác loại bỏ 2 là tốt). – Cascabel

+0

Lưu ý rằng phiên bản * có thể * cũng có các chữ cái trong đó. –

Trả lời

7

Khá rất phù hợp để 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]\+\)*$//') 

Trận đấu thứ hai đảm bảo rằng các số phiên bản là một chuỗi các số cách nhau bằng dấu chấm (ví dụ như X, XX, XXX, ...).

Chỉnh sửa: Vì vậy, có những nhận xét trên tất cả dựa trên thực tế là khái niệm về số phiên bản không được xác định rõ. Bạn sẽ phải viết một regex cho đầu vào mà bạn mong đợi. Hy vọng rằng bạn sẽ không có bất cứ điều gì khủng khiếp như "program-name-1.2.3-a". Không có bất kỳ yêu cầu bổ sung nào từ OP mặc dù, tôi nghĩ rằng tất cả các câu trả lời ở đây là đủ tốt.

+0

Có thể muốn kiểm tra phiên bản thứ hai. ;-) –

+0

@Jon Ericson: Tôi đã làm. Hoạt động như mong đợi cho 'name-X',' name-XX', 'name-X.X',' name-X.X.X' và các loại hoán vị khác. Nó từ chối thay thế bất kỳ thứ gì không phải là số phiên bản được định dạng đúng, như 'name-X.'. Đó không phải là hành vi mong muốn? – Cascabel

+0

Trên hộp của tôi: '$ echo my-program-1.0 | sed 's/- [0-9] \ + \ (\. [0-9] \ + \) * $ //' 'tạo' my-program-1.0' Theo tài liệu, sed không hỗ trợ cú pháp '+'. –

1

Làm thế nào về:

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

Chi tiết về Nitpicky: điều này sẽ khớp với 'program-.' nhưng không khớp với' program-1.2.3'. – Cascabel

+0

@Jefromi: Không còn nữa. ;-) Cú pháp RE của Perl trông đẹp hơn nhiều. –

+0

Vâng, perl >> sed. Đã cố gắng giữ mọi thứ đơn giản ... +1. – Cascabel

2

Bash:

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

Tạo "my-chương trình"

Hoặc

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 

Tạo "alsa-lib"

+0

Đầu tiên là chính xác vì nó tận dụng lợi thế của thực tế là phiên bản không bao giờ có dấu gạch ngang. Thứ hai không phải là vì các phần của tên có thể bắt đầu bằng một chữ số. –

+0

@Ignacio: Đúng, nó sẽ phải là một tên như "abc-2def-1.0.42-2.foo.i286.rpm" sẽ không chính xác trở thành "abc". –

Các vấn đề liên quan