在Bash中提取子串

给定一个文件名的形式为someletters_12345_moreleters.ext,我想提取5位数字并将其放入一个变量中。

所以为了强调这一点,我有一个有x个字符的文件名,然后是一个五位数的序列,两边有一个下划线,然后是另一组x个字符的序列。 我想取5位数的数字,并将其放入一个变量中。

我对有多少种不同的方法可以完成这个任务非常感兴趣。

解决办法

使用cut

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

更加通用。

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

通用的解决方案,数字可以在文件名的任何地方,使用这种序列中的第一个。

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:]]')
评论(1)

还有bash内置的'expr'命令。

INPUT="someletters_12345_moreleters.ext"  
SUBSTRING=`expr match "$INPUT" '.*_\([[:digit:]]*\)_.*' `  
echo $SUBSTRING
评论(2)