我想提取某些文件 .gz/.zip 安装程序的版本发布。
因此 if 被执行(为了简单起见,以这种方式显示):
echo "apache-maven-3.8.4-bin.tar.gz" | cut -d'-' -f 3
echo "gradle-7.3.1-bin.zip" | cut -d'-' -f 2
他们分别返回3.8.4
和7.3.1
。到这里为止一切都很好并且符合预期。
但请考虑以下文件名:
OpenJDK11U-jdk_x64_linux_hotspot_11.0.14_9.tar.gz
我需要 extract 11.0.14_9
,因此到目前为止:
echo "OpenJDK11U-jdk_x64_linux_hotspot_11.0.14_9.tar.gz" | cut -d'_' -f 5
它返回11.0.14
并且我需要11.0.14_9
(观察该_9
部分)。如何实现这个目标?
考虑两种可能的情况: 文件名可以是
OpenJDK11U-jdk_x64_linux_hotspot_11.0.14_9.tar.gz # with '_number'
OpenJDK11U-jdk_x64_linux_hotspot_11.0.14.tar.gz # without '_number'
可能是什么独特的“动态”命令 -如果可以的话- let 返回11.0.14_9
或11.0.14
?
如果其他命令可用于此场景,请告诉我。
答案1
grep -Eo "[0-9]+[0-9\.\_]{2,}" | tail -1 | sed 's/\.$//'
看起来很丑,但它适用于你的例子:
echo "apache-maven-3.8.4-bin.tar.gz" | grep -Eo "[0-9]+[0-9\.\_]{2,}" | tail -1 | sed 's/\.$//'
3.8.4
echo "gradle-7.3.1-bin.zip" | grep -Eo "[0-9]+[0-9\.\_]{2,}" | tail -1 | sed 's/\.$//'
7.3.1
echo "OpenJDK11U-jdk_x64_linux_hotspot_11.0.14_9.tar.gz" | grep -Eo "[0-9]+[0-9\.\_]{2,}" | tail -1 | sed 's/\.$//'
11.0.14_9
grep -Eo "[0-9]+[0-9\.\_]{2,}"
将匹配所有以至少一位数字开头的字符串 ([0-9]+
),后跟两个或多个数字和/或.
_
字符 ([0-9\.\_]{2,}
)。这当然也将匹配64_
您的第三个示例,因此我们只想要最后一个匹配(tail -1
)。最后,这将包括尾随,.
所以我们将其去掉sed 's/\.$//'
。
我确信有一种比我所展示的更简洁的方法来完成此任务。