2011-12-04 12 views
1

一部のビデオファイルの名前を変更するスクリプトを作成しています。いくつかの名前はXXX blah blah.extで、一部はXXX - XXX blah blah.extです。「X」は数字です。さらに、いくつかのファイルは.aviであり、いくつかはmp4です。私が望むのは、これらのファイルから数値を抽出し、複数ある場合はスペースで区切り、 ".mp4"ファイルでは "4"を無視することです。拡張子を無視してファイル名から番号を抽出する

私の現在の実装はegrep -o "[[:digit:]]*"であり、これは異なる出力に数値を分けていますが、 ".mp4"も考慮しています。

sedを使用すると、すべての数値に対して異なる出力を生成できただけでなく、「4」も含まれています。注:私はsedの初心者です。つまり、このスクリプトを書く目的で学習を始めました。

どうすればいいですか?

+0

私は十分な評判を持っていますが、あなたのすべてに感謝していないではない+1することができますので。あなたは本当に助けになり、私はあなたの命令を見てsedについていくつか学んだ。私は "流線型"であり、任意の桁数に拡張可能であるため、 "potong's"に固執します(私はこれに対して他の2つを変えることができると思います)。もう一度ありがとう! – DeoxNa

+0

それを受け入れたとしてマークすることを忘れないでください。 – Joshua

答えて

1
for file in * 
do 
    echo $file | sed 's/\..*$//' | egrep -o "[[:digit:]]*" 
done 
1

あなたは、これはかなり堅牢であることを見つける必要があります。

sed 's/^[^[:digit:]]*\([[:digit:]]\+\)[^[:digit:]]\+\([[:digit:]]\+\)\?[^[:digit:]]\+[[:digit:]]\?$/\1\2/' 

あなたsed-rをサポートしている場合、あなたは脱出するために使用されているバックスラッシュを取り除くことができます。

sed -r 's/^[^[:digit:]]*([[:digit:]]+)[^[:digit:]]+([[:digit:]]+)?[^[:digit:]]+[[:digit:]]?$/\1\2/' 

デモ:

$ echo '123 blah blah.avi 
234 blah blah.mp4 
345 - 678 blah blah.avi 
901 - 234 blah blah.mp4' | 
sed -r 's/^[^[:digit:]]*([[:digit:]]+)[^[:digit:]]+([[:digit:]]+)?[^[:digit:]]+[[:digit:]]?$/\1\2/' 
123 
234 
345 678 
901 234 

これは、ファイル名に2番目の数字の前にスペースがあることに依存します(ファイルがある場合)。それを持たないファイルがある場合、簡単な変更でそれを動作させることができます。

+0

正規表現の完全なマークは '[:digit:]' '[0-9]'で十分でしょうか? – potong

+1

@potong:OPがそれを使用し、数字のために '[0-9] '以外の文字を使用するロケールで動作します。 –

0

これはあなたのために働くかもしれない:

# echo '123 bla bla.avi 
456 - 789 bla bla.avi 
012bla bla.avi 
345-678blabla.avi 
901 bla bla.mp4 
234 - 567 bla bla.mp4 
890bla bla.mp4 
123 - 456 - 789 bla bla.mp4' | 
sed 's/[^0-9]*[0-9]$//;s/[^0-9]\+/ /g' 
123 
456 789 
012 
345 678 
901 
234 567 
890 
123 456 789 
関連する問題