1

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

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

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

これどうやってするの?

4

3 に答える 3

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 番目の数字の前にスペースがある場合 (1 つある場合) に依存します。それがないファイルがある場合は、簡単な変更で機能する可能性があります。

于 2011-12-04T06:04:38.913 に答える
1
for file in *
do
    echo $file | sed 's/\..*$//' | egrep -o "[[:digit:]]*"
done
于 2011-12-04T03:41:42.437 に答える
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
于 2011-12-04T06:29:48.920 に答える