首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >剪切命令:如何使用要考虑/包括在字段位置中的分隔符?

问剪切命令:如何使用要考虑/包括在字段位置中的分隔符?
EN

Unix & Linux用户
提问于 2022-01-30 01:00:49
回答 1查看 56关注 0票数 0

我想解压某些文件的版本版本..gz/..zip安装程序。

因此,如果执行(为了简单起见以这种方式显示):

代码语言:javascript
复制
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,因此到目前为止:

代码语言:javascript
复制
echo "OpenJDK11U-jdk_x64_linux_hotspot_11.0.14_9.tar.gz" | cut -d'_' -f 5

它返回11.0.14,我需要11.0.14_9 (观察者,_9部分)。如何实现这一目标?

在两种可能的情况下考虑:文件名可以是

代码语言:javascript
复制
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?

如果可以在这个场景中使用其他命令,请告诉我。

EN

回答 1

Unix & Linux用户

发布于 2022-01-30 02:46:22

grep -Eo "[0-9]+[0-9\.\_]{2,}" | tail -1 | sed 's/\.$//'看起来很难看,但它适用于您的示例:

代码语言:javascript
复制
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/\.$//'。

我确信有一个更整洁,更紧凑的方式,比我已经展示的完成这一点。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/688504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档