从文件名中提取数字

zet*_*tah 5 bash sed

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

例如:

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

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

我想只提取数字

Vic*_*hez 9

你可以使用这个简单的代码:

filename=zc_adsf_qwer132467_xcvasdfrqw
echo ${filename//[^0-9]/}   # ==> 132467
Run Code Online (Sandbox Code Playgroud)


mvd*_*vds 7

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

ls | sed -e s/[^0-9]//g
Run Code Online (Sandbox Code Playgroud)

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

ls | egrep -o [0-9]+
Run Code Online (Sandbox Code Playgroud)

对于所有数字组(123test456.ext将出现123和456)


gle*_*man 5

只是猛击:

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

或者,使用 bash 4

[[ "$filename" =~ [0-9]+ ]] && nums=${BASH_REMATCH[0]}
Run Code Online (Sandbox Code Playgroud)