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