从文件名中提取数字

时间:2011-09-04 17:45:30

标签: bash sed

在BASH中,我想使用sed,但无法想象如何提取模式而不是通常替换。

例如:

FILENAME ='blah_blah _ ####### _ blah.ext'

密码的数量(在上面的例子中用“#”替换)可以是7或10

我想只提取数字

6 个答案:

答案 0 :(得分:9)

您可以使用以下简单代码:

filename=zc_adsf_qwer132467_xcvasdfrqw
echo ${filename//[^0-9]/}   # ==> 132467

答案 1 :(得分:6)

如果您只需删除除数字之外的任何内容,则可以使用

ls | sed -e s/[^0-9]//g

获取每个文件名分组的所有数字(123test456.ext将变为123456)或

ls | egrep -o [0-9]+

所有数字组(123test456.ext将显示123和456)

答案 2 :(得分:4)

只是打击:

shopt -s extglob
filename=zc_adsf_qwer132467_xcvasdfrqw
tmp=${filename##+([^0-9])}
nums=${tmp%%+([^0-9])}
echo $nums   # ==> 132467

或者,使用bash 4

[[ "$filename" =~ [0-9]+ ]] && nums=${BASH_REMATCH[0]}

答案 3 :(得分:2)

文件名中的其他地方是否有任何数字?如果不是:

 ls | sed 's/[^0-9][^0-9]*\([0-9][0-9]*\).*/\1/g'

应该工作。

Perl one liner可能会更好一点,因为Perl只是有一个更高级的正则表达式解析,并且你可以指定数字范围必须在7到10之间:

ls | perl -ne 's/.*\D+(\d{7,10}).*/$1/;print if /^\d+$/;'

答案 4 :(得分:1)

$ ls -1
blah_blah_123_blah.ext
blah_blah_234_blah.ext
blah_blah_456_blah.ext

在您运行的目录中包含此类文件:

$ ls -1 | sed 's/blah_blah_//' | sed 's/_blah.ext//'
123
234
456

或使用单个sed运行:

$ ls -1 | sed 's/^blah_blah_\([0-9]*\)_blah.ext$/\1/'

答案 5 :(得分:0)

这对你有用 -

echo $FILENAME | sed -e 's/[^(0-9|)]//g' | sed -e 's/|/,/g'