从 ls 中提取子字符串

Posted

技术标签:

【中文标题】从 ls 中提取子字符串【英文标题】:Extract substring from ls 【发布时间】:2013-04-03 02:01:00 【问题描述】:

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

【问题讨论】:

【参考方案1】:

或者简化整个方法:

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

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

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

【讨论】:

+1,这就是我想要发布的内容。但是,一些解释会很好。【参考方案2】:

通过另一个cut

ls -1 | grep '-tomcat-' | cut -f3 -d'-' | cut -f1-3 -d'.'

只要版本都具有三个组件,这将起作用。如果版本只有5.5,那就不行了。

另一种选择是使用sed

ls -1 | grep '-tomcat-' | cut -f3 -d'-' | sed 's/.tar.gz\|.zip//'

这将从字符串中删除.tar.gz.zip

【讨论】:

【参考方案3】:

ls -1 | awk -F. '/-tomcat-/ print $1'

使用 awk 的解决方案。以前的所有答案都一样。

编辑:

我可能误解了,也许这就是你想要的:

ls -1 | awk -F\- '/tomcat/ print substr($3,0,6)'

【讨论】:

以上是关于从 ls 中提取子字符串的主要内容,如果未能解决你的问题,请参考以下文章

PB中取字符串子串的函数是啥

使用 Python 的字符串子序列内核和 SVM

如何更改python字符串子字符串信息

[在python中使用正则表达式搜索字符串子字符串

数组篇在python中如何查找最长字符串子串

求字符串不同子串个数