给定someletters_12345_moreleters形式的文件名。ext,我想提取5位数字,并将它们放入一个变量。
为了强调这一点,我有一个x个字符的文件名,然后是一个5位数字序列,两边都有一个下划线,然后是另一组x个字符。我想把这个5位数代入一个变量。
我对实现这一目标的多种不同方式非常感兴趣。
给定someletters_12345_moreleters形式的文件名。ext,我想提取5位数字,并将它们放入一个变量。
为了强调这一点,我有一个x个字符的文件名,然后是一个5位数字序列,两边都有一个下划线,然后是另一组x个字符。我想把这个5位数代入一个变量。
我对实现这一目标的多种不同方式非常感兴趣。
当前回答
减少使用:
echo 'someletters_12345_moreleters.ext' | cut -d'_' -f 2
更通用的:
INPUT='someletters_12345_moreleters.ext'
SUBSTRING=$(echo $INPUT| cut -d'_' -f 2)
echo $SUBSTRING
其他回答
类似于php中的substr('abcdefg', 2-1, 3):
echo 'abcdefg'|tail -c +2|head -c 3
没有任何子过程,您可以:
shopt -s extglob
front=${input%%_+([a-zA-Z]).*}
digits=${front##+([a-zA-Z])_}
一个非常小的变体也可以在ksh93中工作。
减少使用:
echo 'someletters_12345_moreleters.ext' | cut -d'_' -f 2
更通用的:
INPUT='someletters_12345_moreleters.ext'
SUBSTRING=$(echo $INPUT| cut -d'_' -f 2)
echo $SUBSTRING
通用解决方案,其中数字可以在文件名中的任何位置,使用这样的序列中的第一个:
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:]]')
使用sed replace的简单方法:
result=$(echo "someletters_12345_moreleters.ext" | sed 's/.*_\(.*\)_.*/\1/g')
echo $result