3

追加のパッケージをあまり使用せずに、bashの一部の文字列からバージョン番号を抽出したいと思います。これまでに試しsedました。

APIは次のとおりです。

3.81-8.1ubuntu1.1    should give :  3.81
2.68-1ubuntu2        should give :  2.68
1:1.11.3-1ubuntu2    should give :  1.11.3

これまでの私のsedコマンドは次のとおりです。

echo ... | sed -r 's/.*([0-9\.]+).*/\1/'

ただし、特に最後のケースでは、オープニング.*は貪欲すぎます。私はいくつか試しましたが、成功.*?.\{-}ませんでした。

私は2つのパスでそれを行うことができますが、私はむしろ1つのパスでそれを行う方法を学びたいと思います。

4

2 に答える 2

8

これで大丈夫ですか?

 grep -Po "[\d\.]*(?=-)" file

例:

kent$  cat tt
3.81-8.1ubuntu1.1
2.68-1ubuntu2
1:1.11.3-1ubuntu2

kent$  grep -Po "[\d\.]*(?=-)" tt
3.81
2.68
1.11.3
于 2013-01-22T17:25:09.890 に答える
1

貪欲さを克服するには、正規表現をより厳密にする必要があります。

$ sed -r 's/.*([0-9]+\.[0-9]+\.?[0-9]+)-.*/\1/' file
3.81
2.68
1.11.3

これは、バージョン番号をメジャー、マイナー、およびビルド(オプション)マークと一致させ、常にハイフンが続きます。

于 2013-01-22T17:50:57.203 に答える