Извлечение чисел из имен файлов без учета расширений - PullRequest
1 голос
/ 04 декабря 2011

Я делаю скрипт для переименования некоторых видеофайлов. Некоторые из них названы XXX blah blah.ext, а некоторые XXX - XXX blah blah.ext, где "X" - цифры. Кроме того, некоторые файлы .avi, а некоторые mp4. Я хотел бы извлечь из этих файлов числа, разделенные пробелом, если их больше одного, и игнорировать "4" в файлах .mp4.

Моя текущая реализация - egrep -o "[[:digit:]]*", и хотя она разделяет числа на разные выходные данные, она также учитывает ".mp4".

Используя sed, я не только не смог произвести разные выходы для каждого числа, но также включил "4". Примечание: я очень новичок в sed, то есть я начал изучать его с целью написания этого сценария.

Как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 04 декабря 2011

Вы должны найти это довольно надежным:

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

Это зависит от того, есть ли пробел в имени файла перед вторым числом (если оно есть).Если есть файлы, у которых этого нет, то простая модификация может заставить это работать.

1 голос
/ 04 декабря 2011
for file in *
do
    echo $file | sed 's/\..*$//' | egrep -o "[[:digit:]]*"
done
0 голосов
/ 04 декабря 2011

Это может работать для вас:

# 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
...