7

Bashのみを使用して、パッケージ名からバージョンを削除しようとしています。解決策は 1 つありますが、それが最善の解決策ではないと思うので、より良い方法があるかどうかを知りたいです。より良いとは、よりクリーンで理解しやすいことを意味します。

「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 ファイル名です。

ありがとう!

4

3 に答える 3

9

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]\+\)*$//')

2 番目の一致では、バージョン番号がドットで区切られた一連の番号 (X、XX、XXX など) であることを確認します。

編集:したがって、バージョン番号の概念があまり明確に定義されていないという事実に基づいて、いたるところにコメントがあります。期待する入力の正規表現を作成する必要があります。「program-name-1.2.3-a」のようなひどいものがないことを願っています。ただし、OP からの追加の要求がなければ、ここでのすべての回答で十分だと思います。

于 2010-05-24T17:51:50.203 に答える
4

バッシュ:

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」を生成

于 2010-05-24T18:53:34.653 に答える
1

どうですか:

$ echo my-program-1.0 | perl -pne 's/-[0-9]+(\.[0-9]+)+$//'
my-program
于 2010-05-24T17:51:09.220 に答える