我收到了很多名字都是这样的文件:
tmp1.csv
tmp32.csv
tmp9.csv
tmp76.csv
...
它们在同一个目录中,我想提取文件名中的数字。我怎么能在bash
?
PS
我试过grep
,但无法做到。我也尝试了${filename##[a-z]}
。他们是正确的方式吗?
答案 0 :(得分:4)
ls |grep -o "[0-9]\+"
示例:
$ ls *.csv
3tmp44.csv newdata_write.csv tmp1.csv tmp2.csv
$ ls *.csv |grep -o "[0-9]\+"
3
44
1
2
编辑:
从grep手册页:
基本与扩展正则表达式
In basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their special meaning; instead use the backslashed versions \?, \+, \{, \|, \(, and \).
这就是您需要使用\+
答案 1 :(得分:3)
for f in *.csv; do echo $f | egrep -o "[0-9]+" ; done
如果您的文件名中包含其他带有数字的csv文件,请使用:
for f in *.csv; do echo $f | sed -re 's/^tmp([0-9]+)\.csv$/\1/' ; done
答案 2 :(得分:3)
我可能会使用cut
的几个调用:
$ ls -1 *.csv | cut -dp -f 2 | cut -d. -f1
这个管道确实:
*.csv
模式匹配的所有文件,每行一个tmp4711.csv
4711.csv
。{/ li>
4711.csv
转换为4711
,将数字隔离,我们就完成了。答案 3 :(得分:3)
简单易用,不使用子程序或其他外部工具来打击自己:
for f in *[0-9]*; do
if [[ $f =~ [0-9]+ ]] ; then
echo "$BASH_REMATCH"
fi
done
答案 4 :(得分:1)
find . -maxdepth 1 -type f -name 'tmp[0-9]*.csv' | sed 's/tmp\([0-9]\+\).csv/\1/'