Найти и заменить дату / время в строке - PullRequest
0 голосов
/ 19 сентября 2010

Я уже сделал регулярное выражение, которое должно работать, но оно не работает.

echo "FileName.17:09:2010 4.16.PM.720p.mp4" | sed -E 's/\d{2}:\d{2}:\d{4}\ (\d|\d{2})\.(\d{2}|\d)\.((AM)|(PM))//g'

Должен вывести: FileName..720p.mp4

Но вместо этого выдает то же самое «FileName.17: 09: 2010 4.16.PM.720p.mp4».

Ответы [ 3 ]

1 голос
/ 23 сентября 2010
#! /bin/sh
f="FileName.17:09:2010 4.16.PM.720p.mp4"
echo ${f%%.*}${f##*[AP]M}

Это работает для любой переменной, содержащей строку, соответствующую шаблону.См. Расширение параметров для переменных оболочки .

С помощью sed просто удалите от первой точки до AM или PM.Или, если имя файла может иметь посторонние точки, то удалите от 1-го числа, сопровождаемого ':' до [AP] M, 's/\.[0-9]\+:.*\[AP]M//'

Я думаю, что способ sed мог бы быть лучше;потому что, если это не удается, он возвращает исходную строку.Несоответствие в выражении оболочки вернет часть имени дважды;но проверка ошибок может быть легко добавлена: она не работает для файлов, не имеющих AM или PM в имени.

echo FileName.17:09:2010 4.16.PM.720p.mp4|sed  -e 's/\..*[AP]M\././'
1 голос
/ 19 сентября 2010

Является ли \d допустимым классом символов в sed ?Попробуйте заменить его на [0-9] или [:digit:].См. re_format .

0 голосов
/ 19 сентября 2010
bash$ echo "FileName.17:09:2010 4.16.PM.720p.mp4"|ruby -e 's=gets.chomp.split(".");puts [s[0],s[-2,2]].join(".")'
FileName.720p.mp4
...