从字符串中的特定字符串模式中提取数字

时间:2012-06-07 16:00:22

标签: regex bash

我正在使用bash迭代文件名,并且需要一种从前面的字符标注的字符串中提取特定数字的方法。从本质上讲,所有文件都有一部分名称,看起来像D01D02。示例文件名为Build-asdasdasd.D01V02.dat。我试图使用sed,但到目前为止无济于事。谢谢!

4 个答案:

答案 0 :(得分:1)

Pure Bash:

name='Build-asdasdasd.D01V02.dat'

[[ "$name" =~ \.(D[[:digit:]]{2}[[:upper:]][[:digit:]]{2})\. ]] \
   && number="${BASH_REMATCH[1]}" || number=''

echo  "'$number'"

回声显示

'D01V02'

答案 1 :(得分:0)

您不必在单个表达式中执行所有操作。您可以构建一个管道,如下所示:

echo 'Build-asdasdasd.D01V02.dat' |
egrep -o '\.D([[:digit:]]{2}[^.]+)' |
sed 's/^.//'

这会为我返回D01V02,但您可能希望针对更广泛的语料库测试您的表达式,以查看是否存在任何边缘情况。

答案 2 :(得分:0)

这是另一个纯bash答案,假设您的文件名始终与示例相似。正则表达式不是必需的。

name='Build-asdasdasd.D01V02.dat'
number="${name%.*}"
number="${name##*.}"
echo "$number"

答案 3 :(得分:0)

你的问题很不清楚。如果您想要D之后的数字,可以使用

f="Build-asdasdasd.D01V02.dat"
num=$(grep -Po '(?<=D)\d\d' <<< "$f")

num=$(sed 's/^.*D\([[:digit:]][[:digit:]]\).*/\1/' <<< "$f")