4

名前が次のようなファイルをたくさん入手しました。

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

それらは同じディレクトリにあり、ファイル名の番号を抽出したいと思います。どうすればそれを行うことができbashますか?

PS

やってみ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のmanページから:

基本的な正規表現と拡張された正規表現

   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パターンに一致するすべてのファイルを1行に1つずつ一覧表示します
  2. 文字「p」を区切り文字として使用し、各行の2番目のフィールドを切り取ります。これは、たとえばに変換tmp4711.csvされ4711.csvます。
  3. 文字「。」を使用します 区切り文字として、各行の最初のフィールドを切り取ります。4711.csvこれはちょうどに変換され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 に答える