4

我有很多文件的名称是这样的:

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

它们在同一个目录中,我想提取文件名中的数字。我怎样才能做到这一点bash

附言

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

4

5 回答 5

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 \).

这就是为什么你需要使用\+

于 2012-05-03T13:20:46.500 回答
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
于 2012-05-03T13:17:05.757 回答
3

我可能会使用几个调用cut

$ ls -1 *.csv | cut -dp -f 2 | cut -d. -f1

该管道可以:

  1. 列出与*.csv模式匹配的所有文件,每行一个
  2. 使用字母“p”作为分隔符,并删除每行的第二个字段。这例如tmp4711.csv转换为4711.csv.
  3. 使用字母“。” 作为分隔符,并删除每行的第一个字段。这转换4711.csv为 just 4711,将数字隔离开来,我们就完成了。
于 2012-05-03T13:19:12.070 回答
3

简单易用,不使用 bash 本身外部的子进程或其他工具:

for f in *[0-9]*; do
  if [[ $f =~ [0-9]+ ]] ; then
    echo "$BASH_REMATCH"
  fi
done
于 2012-05-03T13:20:03.573 回答
1
find . -maxdepth 1 -type f -name 'tmp[0-9]*.csv' | sed 's/tmp\([0-9]\+\).csv/\1/'
于 2012-05-03T13:15:24.820 回答