cut 命令:如何使用分隔符来考虑/包含在字段位置中?

cut 命令:如何使用分隔符来考虑/包含在字段位置中?

我想提取某些文件 .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.47.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_911.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/\.$//'

我确信有一种比我所展示的更简洁的方法来完成此任务。

相关内容