猿问

在Bash中提取子字符串

在Bash中提取子字符串

在表单中给出文件名someletters_12345_moreleters.ext,我想提取这5位数,并将它们放入一个变量中。

因此,为了强调这一点,我有一个文件名,其中有x个字符,然后是一个5位序列,两边都有一个下划线,然后是另一组x个字符。我想取5位数,然后把它放进一个变量中。

我非常感兴趣的是,有多少种不同的方法可以做到这一点。


白衣非少年
浏览 430回答 3
3回答

三国纷争

使用切:echo 'someletters_12345_moreleters.ext' | cut -d'_' -f 2更一般的:INPUT='someletters_12345_moreleters.ext'SUBSTRING=$(echo $INPUT| cut -d'_' -f 2)echo $SUBSTRING

噜噜哒

如果x为常数,下面的参数展开执行子字符串提取:b=${a:12:5}哪里12是偏移量(基于零)和5是长度如果数字周围的下划线是输入中的唯一下划线,则可以分两个步骤去掉前缀和后缀:tmp=${a#*_}   # remove prefix ending in "_"b=${tmp%_*}   # remove suffix starting with "_"如果有其他的下划线,它可能是可行的无论如何,虽然更棘手。如果有人知道如何在单个表达式中执行这两种扩展,我也想知道。这两种解决方案都是纯bash,不涉及进程生成,因此非常快。

波斯汪

通用解决方案,其中的数字可以在文件名中的任何位置,使用第一个这样的序列: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:]]')
随时随地看视频慕课网APP
我要回答