仅从行集中获取版本号

时间:2014-05-15 19:02:27

标签: bash unix awk sed grep

如何只获取一组行的版本?

这些是平面文件的行:

./org.jamon/jamon-runtime/jars/jamon-runtime-2.3.1.jar
./org.apache.ftpserver/ftplet-api/bundles/ftplet-api-1.0.0.jar
./org.clojars.jasonjckn/kafka_2.9.2/jars/kafka_2.9.2-0.7.2-test1.jar
./org.apache.ftpserver/ftpserver-deprecated/jars/ftpserver-deprecated-1.0.0-M2.jar
./org.codehaus.jettison/jettison/bundles/jettison-1.1.jar
./stax/stax-api/jars/stax-api-1.0.1.jar

输出:

 2.3.1
 1.0.0
 0.7.2-test1
 1.0.0-M2
 1.1

4 个答案:

答案 0 :(得分:3)

对于 sed 解决方案:

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

说明:

  • 替换:任何+连字符+ revision +“。jar”只包含revision,其中:

  • revision被标识为:以数字开头,后跟数字或点,后跟除斜杠/以外的任何文字,并在其前面连字符-

  • “。jar”必须在行尾。

答案 1 :(得分:1)

将GNU grep-P选项一起使用(PCRE正则表达式用于展望未来):

grep -oP '(?<=-)[0-9.]+[-[:alnum:]]*(?=\.jar)' file
2.3.1
1.0.0
0.7.2-test1
1.0.0-M2
1.1
1.0.1

根据评论中的建议cbuckley,更通用的说法是(如果您的文件的扩展名不是.jar,则会有效:

grep -oP '(?<=-)[\d.]+[-\w]*(?=\.\w+)' file

答案 2 :(得分:0)

你走了:

awk -F/ '{n=split($NF,a,"-");if (a[n-1]~/[0-9.]+/) a[n]=a[n-1]"-"a[n];sub(/\.jar$/,"",a[n]);print a[n]}' file
2.3.1
1.0.0
0.7.2-test1
1.0.0-M2
1.1
1.0.1

如果你gnu grep使用了Jaypal的解决方案:),这个awk应该适用于大多数系统。

答案 3 :(得分:0)

简单的解决方案是

grep -Po "(?<=-)\d[^/]*(?=\.jar$)"