从文件名提取版本号

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

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等variables

你要:

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

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

你其实不需要任何外部工具。 你可以在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 ~]$ 

人们忘记有一个更简单的, cut

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

尝试:

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