2012-06-07 49 views
0

我使用bash遍历文件名,并且需要从前面字符标记的字符串中提取特定数字的方法。实质上,所有文件的名称部分看起来像D01D02。示例文件名是Build-asdasdasd.D01V02.dat。我试图使用sed,但迄今为止无济于事。谢谢!从字符串中的特定字符串模式中提取数字

+4

请张贴你的代码的相关部分改善你的问题,[适当格式化](HTTP://计算器。 COM /编辑 - 帮助)。此外,请发布您收到的实际错误消息,以及您迄今采取了哪些步骤来研究或解决您的编程问题。 –

回答

0

您不必在单一表达式中做所有事情。你可以建立一个管道,像这样:

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

这将返回D01V02我,但你可能想测试针对更广泛的语料你的表情,看看是否有任何边缘情况。

1

纯击:

name='Build-asdasdasd.D01V02.dat' 

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

echo "'$number'" 

回波显示

'D01V02' 
0

这里是另一个纯bash的回答假设你的文件名总是相似的例子。正则表达式不是必需的。

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

你的问题还不太清楚。如果你想在D后面的数字,你可以使用

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

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

你应该注意到-P是GNU专用的。 – jordanm