为了账号安全,请及时绑定邮箱和手机立即绑定

在Bash中提取子字符串

在Bash中提取子字符串

白衣非少年 2019-07-09 16:32:34
在Bash中提取子字符串在表单中给出文件名someletters_12345_moreleters.ext,我想提取这5位数,并将它们放入一个变量中。因此,为了强调这一点,我有一个文件名,其中有x个字符,然后是一个5位序列,两边都有一个下划线,然后是另一组x个字符。我想取5位数,然后把它放进一个变量中。我非常感兴趣的是,有多少种不同的方法可以做到这一点。
查看完整描述

3 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

使用:

echo 'someletters_12345_moreleters.ext' | cut -d'_' -f 2

更一般的:

INPUT='someletters_12345_moreleters.ext'SUBSTRING=$(echo $INPUT| cut -d'_' -f 2)echo $SUBSTRING


查看完整回答
反对 回复 2019-07-09
?
噜噜哒

TA贡献1784条经验 获得超7个赞

如果x为常数,下面的参数展开执行子字符串提取:

b=${a:12:5}

哪里12是偏移量(基于零)和5是长度

如果数字周围的下划线是输入中的唯一下划线,则可以分两个步骤去掉前缀和后缀:

tmp=${a#*_}   # remove prefix ending in "_"b=${tmp%_*}   # remove suffix starting with "_"

如果有其他的下划线,它可能是可行的无论如何,虽然更棘手。如果有人知道如何在单个表达式中执行这两种扩展,我也想知道。

这两种解决方案都是纯bash,不涉及进程生成,因此非常快。


查看完整回答
反对 回复 2019-07-09
?
波斯汪

TA贡献1811条经验 获得超4个赞

通用解决方案,其中的数字可以在文件名中的任何位置,使用第一个这样的序列:

number=$(echo $filename | egrep -o '[[:digit:]]{5}' | head -n1)

另一种完全提取变量一部分的解决方案:

number=${filename:offset:length}

如果您的文件名始终具有以下格式stuff_digits_...您可以使用awk:

number=$(echo $filename | awk -F _ '{ print $2 }')

删除数字以外的所有内容的另一种解决方案,请使用

number=$(echo $filename | tr -cd '[[:digit:]]')


查看完整回答
反对 回复 2019-07-09
  • 3 回答
  • 0 关注
  • 429 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信