我有很多文件的名称是这样的:
tmp1.csv
tmp32.csv
tmp9.csv
tmp76.csv
...
它们在同一个目录中,我想提取文件名中的数字。我怎样才能做到这一点bash
?
附言
我试过grep
了,但做不到。我也试过了${filename##[a-z]}
。他们是正确的方法吗?
我有很多文件的名称是这样的:
tmp1.csv
tmp32.csv
tmp9.csv
tmp76.csv
...
它们在同一个目录中,我想提取文件名中的数字。我怎样才能做到这一点bash
?
附言
我试过grep
了,但做不到。我也试过了${filename##[a-z]}
。他们是正确的方法吗?
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 \).
这就是为什么你需要使用\+
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
我可能会使用几个调用cut
:
$ ls -1 *.csv | cut -dp -f 2 | cut -d. -f1
该管道可以:
*.csv
模式匹配的所有文件,每行一个tmp4711.csv
转换为4711.csv
.4711.csv
为 just 4711
,将数字隔离开来,我们就完成了。简单易用,不使用 bash 本身外部的子进程或其他工具:
for f in *[0-9]*; do
if [[ $f =~ [0-9]+ ]] ; then
echo "$BASH_REMATCH"
fi
done
find . -maxdepth 1 -type f -name 'tmp[0-9]*.csv' | sed 's/tmp\([0-9]\+\).csv/\1/'