在BASH中,我想使用sed
,但无法想象如何提取模式而不是通常替换。
例如:
FILENAME ='blah_blah _ ####### _ blah.ext'
密码的数量(在上面的例子中用“#”替换)可以是7或10
我想只提取数字
答案 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'