LINUX.ORG.RU

обработка имен видео-файлов при помощи sed или awk

 , ,


0

1

В общем такая ситуация: есть скачанные с торрентов фильмы, у большинства видео-файлов имеются 3-и наиболее распространенных формата наименований: 1) Name.of.film.2013.BDRip.hlam.(mkv|avi) 2) Name.of.film.2013.hlam.(mkv|avi) 3) Name.of.film.2013.(mkv|avi)

под hlam имеется ввиду наименование кодека и прочее. Цель сохранить только наименование фильма, год, и тип rip'а и естественно расширение, т.е. отбросить hlam. И заменить разделитель '.' на '_'

я знаю как реализовать через if все три случая с 3-я седами. пример для 1-ого случая:

sed "s/\([0-9]\{4\}\.$TYPE_VID\)\(.*\)\(\.\)\($EXT\)/\1\3\4/i; s/$SEP/_/g; s/\(_\)\($EXT\)/.\2/"
где $TYPE_VID=«BDRip\|CAMRip», $SEP=«\.\|_\| », $EXT=«mkv\|avi» Возможно ли реализовать как-то все с одним седом, который бы обрабатывал все 3-и случая?



Последнее исправление: cetjs2 (всего исправлений: 1)

Сама регулярка, описывающая общий случай, может выглядеть как-то так:

/^(.+[12]\d\d\d\.)(BDRip|)(.*)(\(mkv\|avi\))/

Осталось переписать на sed, который я к сожалению плохо знаю. А например на JS выглядело бы примерно так:


s1="Name.of.film.2013.BDRip.hlam.(mkv|avi)"
s2="Name.of.film.2013.hlam.(mkv|avi)"
s3="Name.of.film.2013.(mkv|avi)"

re=/^(.+[12]\d\d\d\.)(BDRip|)(.*)(\(mkv\|avi\))/

w(s1.replace(re, "$1$2$4"))
w(s2.replace(re, "$1$2$4"))
w(s3.replace(re, "$1$2$4"))

//  Name.of.film.2013.BDRip(mkv|avi)
//  Name.of.film.2013.(mkv|avi)
//  Name.of.film.2013.(mkv|avi)

terminator-101
()
Ответ на: комментарий от terminator-101

w там означает напечатать, это сокращение w=console.log, забыл исправить

//fixed

terminator-101
()
sed -r 's/^(.*[1-2][0-9]{3})(.CAMRip|.BDRip)?.*\.(mkv|avi)$/\1\2\*\3/
        s/\./_/g
        s/\*/./'
unclear
()
Ответ на: комментарий от terminator-101

Сама регулярка, описывающая общий случай, может выглядеть как-то так

Ога..«a.2000.year.old.man.1961.remastering.2013.bla-bla.avi»

это я вот к чему: если делать хорошо, надолго и не только для себя, то подобные вещи разбираются с «конца», постепенно откусывая всё что выглядит очевидно как тех.данные.

MKuznetsov ★★★★★
()
Ответ на: комментарий от terminator-101

Сама регулярка, описывающая общий случай, может выглядеть как-то так:

/^(.+[12]\d\d\d\.)(BDRip|)(.*)(\(mkv\|avi\))/

Осталось переписать на sed, который я к сожалению плохо знаю

тут надо:

1. заменить \d\d\d на [0-9]{3}

2. sed с ключом -r

3. (mkv|avi) это так оно и есть регуляркой, а не дословно, как ты понял.

4. полностью

sed -r 's/^(.+[12][0-9]{3}.)(BDRip|)(.*)(mkv|avi)/\1\2\4/'

5. проверить надо, а мне надо спать.

emulek
()
Ответ на: комментарий от MKuznetsov

это я вот к чему: если делать хорошо, надолго и не только для себя

не взлетит. Эти имена _люди_ придумывают, зачастую очень далёкие от компьютеров. Могу только предложить заставить sed выдавать код ошибки, например так:

sed '
s/…/…/
t win
# fail
q 1 # выход с кодом 1
:win
# победа!
'

т.е. если удачно распарсила, то win, иначе fail.

По уму лучше в скрипте делать

#!/bin/sed -f

s/…/…/
t win
# fail
q 1 # выход с кодом 1
:win
# победа!

emulek
()
Ответ на: комментарий от terminator-101

скастуй Emulek

1. тега sed достаточно

2. сам-бы и скастовал

emulek
()
Ответ на: комментарий от emulek

Эти имена _люди_ придумывают

дык и я об том..но факт что «гуманитарное» название оно впереди, а за ним следуют около-технические теги, которые проставляются зачатую программным образом.

Алгоритм выделения «гуманитарной части» можно придумать на подобии: разбить строку по возможным разделителям и найти максимальный префикс не включающий известные тех.термины, и если последним словом в префиксе что-то напоминающее год, то зашибись - парсинг почти удался. А если этот префикс (он-же кандидат в название) ещё и можно найти в imdb то совсем совсем хорошо.

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

но факт что «гуманитарное» название оно впереди, а за ним следуют около-технические теги, которые проставляются зачатую программным образом.

в том-то и фишка, что их тоже люди ставят, постоянно пишут вместо bdrip bdrp, в каждом втором имени меняют теги местами и т.п.

т.е. вместо Name.of.film.2013.BDRip.hlam.mkv

вполне может быть Name.of.film.BDRip.2013.hlam.mkv

ещё и можно найти в imdb

ага. Хрен там был. Вполне может быть и «ёжик в тумане», и «Ежик В Тумане», естественно и «ежи_в_тумане» (буква не пропечаталась), и конечно «ezjik_v_tumane»(а ТС настаивает на варианте «Ежик.В.Тумане»). Зайди на известные торрент-сайты и охреней. В рашке правда самые известные сайты забанили нафиг.

если последним словом в префиксе что-то напоминающее год

а вот год часто не ставят.

За что я не люблю торренты, так это за то, что там имя файла менять нельзя(точнее можно, но мало кто это умеет). Ну и потому очевидная опечатка так и будет торчать в имени файла, т.ч. 5013й и 2073й год — вполне нормально. Скажи спасибо, что не 2-13 и не 20ё3 (а это релизер промахнулся по кнопкам, т.к. пьяный был).

Такие дела.

emulek
()
Ответ на: комментарий от anonymous

rename

круто. А команду целиком можно глянуть?

PS: иди читай ОП, и не позорься.

emulek
()

perl-rename.

anonymous
()
Ответ на: комментарий от emulek

т.е. вместо Name.of.film.2013.BDRip.hlam.mkv
вполне может быть Name.of.film.BDRip.2013.hlam.mkv

Ну я исходил из того как отформатировано большинство имен видео-файлов на NAS, и эти форматы придумывают администраторы трекеров, у них в правилах все расписывается, поэтому придержимаюсь большинства. Где-то конечно за этим следят, где-то нет. Регистр наименований как правило особо не страдает, но навсякий применяю флаг i. И да, кстати, год некоторые не проставляют, особенно если торрент со статусом временного и еще не прошедший премодерацию. Цели исправлять грамматику не ставил:) это уже крайность, если понадобится то уже в ручную.

Алгоритм выделения «гуманитарной части» можно придумать на подобии: разбить строку по возможным разделителям и найти максимальный префикс не включающий известные тех.термины, и если последним словом в префиксе что-то напоминающее год, то зашибись - парсинг почти удался. А если этот префикс (он-же кандидат в название) ещё и можно найти в imdb то совсем совсем хорошо.

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

Спасибо ребят, больше понравился вариант unclear, правда всеравно есть случаи когда и года то нет и похоже какого-то одного шаблона на это не напишешь, пожалуй без оператора ветвления здесь не обойтись, хотя бы для проверки на наличие года, как минимум.

Runaway
() автор топика
Ответ на: комментарий от Runaway

Ну я исходил из того как отформатировано большинство имен видео-файлов на NAS, и эти форматы придумывают администраторы трекеров, у них в правилах все расписывается

про чужой монастырь и свой устав слышал? Вот у них, как в Linux'е с дистрибутивами. Все — леннарты, только Патрег бох.

пожалуй без оператора ветвления здесь не обойтись

ВНЕЗАПНО: в sed их ТРИ штуки. Что ты их так боишься? Они не кусаются, это не команда e.

emulek
()
Ответ на: комментарий от emulek

про чужой монастырь и свой устав слышал? Вот у них, как в Linux'е с дистрибутивами. Все — леннарты, только Патрег бох.

да это понятно, что у каждого свое, но я пользуюсь в основном двумя трекерами, и различие в формате у них не велико.

ВНЕЗАПНО: в sed их ТРИ штуки. Что ты их так боишься? Они не кусаются, это не команда e.

три?! через b и t инструкции ок, а остальное через что реализуемо?

Runaway
() автор топика
Ответ на: комментарий от Runaway

1. переход командой t

2. переход командой T

3. переход условным выполнением, к примеру

if(s==1)
  s=2;
else
  s=3;
/1/{
  s//2/
  bl
}
  s/.*/3/
:l

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.