我想解压某些文件的版本版本..gz/..zip安装程序。
因此,如果执行(为了简单起见以这种方式显示):
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我需要提取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'唯一的“动态”命令( if可以是)是什么?它允许返回11.0.14_9或11.0.14?
如果可以在这个场景中使用其他命令,请告诉我。
发布于 2022-01-30 02:46:22
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_9grep -Eo "[0-9]+[0-9\.\_]{2,}"将匹配以至少一个数字开头的所有字符串([0-9]+),后面跟着两个或多个数字和/或. _字符([0-9\.\_]{2,})。当然,这也将匹配第三个示例中的64_,因此我们只需要最后一个匹配(tail -1)。最后,这将包括尾随的.,因此我们去掉了sed 's/\.$//'。
我确信有一个更整洁,更紧凑的方式,比我已经展示的完成这一点。
https://unix.stackexchange.com/questions/688504
复制相似问题