名前が次のようなファイルをたくさん入手しました。
tmp1.csv
tmp32.csv
tmp9.csv
tmp76.csv
...
それらは同じディレクトリにあり、ファイル名の番号を抽出したいと思います。どうすればそれを行うことができbash
ますか?
PS
やってみgrep
ましたが、出来ません。また、私は試し${filename##[a-z]}
ました。彼らは正しい道ですか?
名前が次のようなファイルをたくさん入手しました。
tmp1.csv
tmp32.csv
tmp9.csv
tmp76.csv
...
それらは同じディレクトリにあり、ファイル名の番号を抽出したいと思います。どうすればそれを行うことができbash
ますか?
PS
やってみ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のmanページから:
基本的な正規表現と拡張された正規表現
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
パターンに一致するすべてのファイルを1行に1つずつ一覧表示しますtmp4711.csv
され4711.csv
ます。4711.csv
これはちょうどに変換され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/'