从文件名中提取数字

时间:2012-05-03 13:13:06

标签: bash

我收到了很多名字都是这样的文件:

tmp1.csv
tmp32.csv
tmp9.csv
tmp76.csv
...

它们在同一个目录中,我想提取文件名中的数字。我怎么能在bash

中做到这一点

PS

我试过grep,但无法做到。我也尝试了${filename##[a-z]}。他们是正确的方式吗?

5 个答案:

答案 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

这个管道确实:

  1. 列出与*.csv模式匹配的所有文件,每行一个
  2. 使用字母“p”作为分隔符,并在每行上剪切第二个字段。这改变了例如tmp4711.csv 4711.csv。{/ li>
  3. 使用字母'。'作为分隔符,并删除每行的第一个字段。这会将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/'