ファイル名からバージョン文字列を抽出

ファイル名からバージョン文字列を抽出

a.txtファイルには、バージョン文字列が埋め込まれたファイル名のリストがあります。例:

gson-2.1
xmlParserAPIs-2.4.0
acrobat-1.1
orai18n-mapping-12.1.0.2
jdbc-se2.0
eclipse-core-runtime-20070801
trove-2.0.1
antisamy-1.3
javax.annotation
dojo-4342
org.json-0.0.1
castor-1.2-jdo

試してみましたcat a.txt | tr -d "[:alpha:]-_" | lessが、正しくないようです。

eg
2.1
2.4.0
1.1
1812.1.0.2   <--- wrong
2.0
20070801
2.0.1
1.3
.
4342
.0.0.1
1.        <--- wrong

どのような助けでも大歓迎です。

答え1

リストした文字列のすべてに完全に一致させることは不可能です。「orai18n-」と「-se2.0」のようなものを区別する方法がないからです。ダッシュで始まる数字とドットの文字列を検索する正規表現を作成すると、「java-se2.0」文字列を除くすべての文字列にかなりよく一致します。

sed 's/.*-\([0-9\.][0-9\.]*\).*/\1/'

(バージョンによっては、sed -r を使用して [0-9.]+ の使用を許可できます)

これにより、認識されたすべてのバージョンが抽出され、適切なものが見つからない場合は文字列全体が表示される出力が生成されます。

2.1
2.4.0
1.1
12.1.0.2
jdbc-se2.0
20070801
2.0.1
1.3
javax.annotation
4342
0.0.1
1.2

答え2

以下を使用できますgrep:

grep -oP '(?<=-)([0-9]+\.?)+' a.txt

これにより、すべてのバージョン番号が抽出されます。行にバージョンが含まれていない場合 (例javax.annotation)、何も印刷されません。

正規表現:

  • (?<=-): まずダッシュ(-)を探しますが、一致の一部ではありません
  • [0-9]+: 数字を検索すると、数字は少なくとも1回以上出現するはずです
  • ([0-9]+\.?)+: ドット ( .) は存在してもしなくてもよく、すべて少なくとも 1 回は出現する必要があります。

答え3

以下の小さなスクリプトを試すことができます:

cat a.txt | sed 's/[-/a-zA-Z]//g'

関連情報