linux - 从 ls 中提取子字符串

标签 linux bash unix substring

我正在创建一个小脚本,我必须列出我所有的 Tomcat 二进制文件。
到目前为止,我能够做到这一点:
ls -1 | grep '\-tomcat\-' |剪切-f3 -d'-'

这基本上列出了所有版本,但它添加了 .zip 或 .tar.gz

5.5.17.zip
5.5.26.tar.gz
5.5.27.tar.gz
5.5.28.tar.gz
5.5.31.tar.gz
5.5.32.tar.gz


我想知道如何从提取的字符串中删除 .zip 和 .tar.gz。

最佳答案

或者简化整个方法:

ls apache-tomcat*|sed -r 's/^.*-([0-9.]+)\..*/\1/'

更少的工具,它会为您提供版本号。

P.S.:跟进@Nemo 的建议:我们让 shell 通配符和先验知识完成一半的工作(只列出实际上看起来像 apache-tomcat 的东西)。当将 ls 的输出通过管道传输到另一个工具时,-1 没有实际意义,因此我们摆脱了它。 sed 接受来自 ls 的值,将行首与第一行匹配 - 后跟一个数字,括号记住所有数字和文字句点,然后我们匹配字符串的其余部分直到行尾(隐式)。然后整个匹配被替换为记住的数字和句点。

关于linux - 从 ls 中提取子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15939226/

相关文章:

linux - "docker run -ti ubuntu:latest"是否通过 "bash"有什么区别?

linux - 使用 wpa_supplicant 中的状态/事件通知获取连接过程错误的原因

bash - ssh-在初始连接上执行时,echo $ SSH_CLIENT返回空

python - Bash 与 Perl/Python : OS call perfomace

shell - 如何在shell中将文件读入变量?

c++ - 在 linux 中编译简单的 C++ 程序(第一次)

linux - 在我自己的存储库中将只读供应商 SVN 存储库设置为镜像/外部

c - 使用 shmctl() 销毁共享内存段 (Linux)

bash - 找出上次在 bash 中设置环境变量的位置

linux - 当输入被重定向到一个文件时,如何比较两个二进制文件的输出?