从文件名中提取版本字符串

从文件名中提取版本字符串

我们在文件中有一个文件名列表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]+\.?)+: 点 ( .) 处可以存在也可以不存在,并且必须至少出现一次。

答案3

您可以尝试下面的小脚本:

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

相关内容