我们在文件中有一个文件名列表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'