从文件名中提取版本号

5

我有一个文件在这样的文件夹中:

installer-x86_64-XXX.XX-diagnostic.run

其中XXX.XX是版本号,我只需要版本号。 如何在Linux中做到这一点?

我有这段代码:

#!/bin/bash
current_ver=$(find /mnt/builds/current -name '*.run'|awk -F/ '{print $NF}')

所以这个代码段可以正确地给出文件名(不包括路径,我不需要它)。

但是我该如何将 XXX.XX 版本号仅存储在变量 $version 中呢?

4个回答

7

实际上你不需要任何外部工具。你可以完全在bash中通过根据模式截断变量来完成此操作。

[ghoti@pc ~]$ name="installer-x86_64-XXX.XX-diagnostic.run"
[ghoti@pc ~]$ vers=${name#*-}; echo $vers
x86_64-XXX.XX-diagnostic.run
[ghoti@pc ~]$ vers=${vers#*-}; echo $vers
XXX.XX-diagnostic.run
[ghoti@pc ~]$ vers=${vers%-*}; echo $vers
XXX.XX
[ghoti@pc ~]$

或者,如果您愿意,您可以先从右侧开始截取片段:
[ghoti@pc ~]$ name="installer-x86_64-XXX.XX-diagnostic.run"
[ghoti@pc ~]$ vers=${name%-*}; echo $vers
installer-x86_64-XXX.XX
[ghoti@pc ~]$ vers=${vers##*-}; echo $vers
XXX.XX
[ghoti@pc ~]$ 

当然,如果您想使用外部工具,那也可以。
[ghoti@pc ~]$ name="installer-x86_64-XXX.XX-diagnostic.run"
[ghoti@pc ~]$ vers=$(awk -F- '{print $3}' <<<"$name")
[ghoti@pc ~]$ echo $vers
XXX.XX
[ghoti@pc ~]$ vers=$(sed -ne 's/-[^-]*$//;s/.*-//;p' <<<"$name")
[ghoti@pc ~]$ echo $vers
XXX.XX
[ghoti@pc ~]$ vers=$(cut -d- -f3 <<<"$name")
[ghoti@pc ~]$ echo $vers
XXX.XX
[ghoti@pc ~]$ 

1
谢谢这个教程,它会很有用。 - Abeed Salam

5

你希望:

awk -F"-" '{ print $3 }'

使用-F指定分隔符。在这种情况下,是-。版本号是第三个字段,因此需要使用$3

4

尝试:

current_ver=$(find /mnt/builds/current -name '*.run'|grep -Eo '[0-9]+\.[0-9]+')

你在这里用grep做什么?你是用[0-9]参数搜索整数吗?-Eo是什么意思? - Abeed Salam
1
@AbeedSalam - 阅读有关grep的“-o”选项的说明。它会导致grep仅输出匹配的位。尽管它非常方便,但与“-P”结合使用时更加有用(用于preg,比ERE更实用)。请注意,grep -P在FreeBSD或OSX中无法使用。对于FreeBSD,您需要安装一个提供pcregrep的不同软件包。 - Graham
@AbeedSalam - 是的,grep匹配小数点周围的整数,因此可以提取例如100.456这样的数字。 - cEz

4

人们常常忘记还有一个更简单的方法,cut

$ echo "installer-x86_64-XXX.XX-diagnostic.run" | cut -d - -f 3
XXX.XX

那么什么时候使用 cut,什么时候使用 awk? - Abeed Salam
@AbeedSalam,cut可以完成这个任务,即在这种情况下分割一行,并且它做得很好。例如,awk不仅可以做到这一点。如果我需要在两者之间选择来完成同样的任务,我会选择cut,因为它更简单。 - Alexander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接