從檔案名稱中提取版本字串

從檔案名稱中提取版本字串

我們在文件中有一個文件名列表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]+:搜尋數字,它們應該至少出現一次或多次
  • ([0-9]+\.?)+: at 點 ( .) 可以存在也可以不存在,而且所有這些都必須至少出現一次。

答案3

您可以嘗試下面的小腳本:

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

相關內容