Изменить дату «29 июля 2011 года» на «20110729»

8

У меня много HTML-файлов содержит дату в формате July 29th, 2011

Я хочу изменить формат даты July 29th, 2011на 20110729, December 9th, 2010на 20101209и т. Д.

Я думаю, что sedможет работать, но все еще не может найти решение из-за его косвенной последовательности.

Наджиб-ботак Чин
источник
Вы бы лучше с Perl, который может читать один формат даты и выводить другой, но мой Perl-Foo не достаточно хорош, надеюсь, кто-то еще
скинется

Ответы:

7

Подобные вещи намного сложнее, чем должно быть с большинством инструментов. awkМодуль GNU и POSIX Perl оба дают вам strftime(), но не дают strptime(), что вам нужно.

В любом случае, с Perl все еще довольно просто ...

$ perl -MDate::Manip -lpe '$_=UnixDate(ParseDate($_), "%Y%m%d")' <<END
> July 29th, 2011
> December 9th, 2010
> END
20110729
20101209

Очевидно, это еще не все, поскольку вы действительно хотите конвертировать HTML. Если вы можете найти регулярное выражение с помощью sed, которое будет работать для поиска строк дат, вы сможете сделать что-то очень похожее с Perl.

$ perl -MDate::Manip -lpe 's/(")([^"]+)(")/$1 . UnixDate(ParseDate($2), "%Y%m%d") . $3/ge' <<END
dates enclosed "July 29th, 2011" in quotes
"December 9th, 2010"
END
dates enclosed "20110729" in quotes
"20101209"
Стивен Притчард
источник
Где / Как я могу получить Date::Manipмодуль? ... Мой Perl выдает ошибку "Не удается найти Date / Manip.pm в @INC ..." . Это дополнительный модуль мне нужно как-то установить? ... Я использую Perl, v5.10.1
Peter.O
@fred: У большинства менеджеров пакетов дистрибутивов это есть, попробуйте поискать там. В моей системе имя пакета, perl-Date-Manipно ваше будет отличаться. Вы также можете получить его с помощью cpan.
Калеб
@ StevenPritchard: Вы пишете хорошие и полезные ответы, я рад видеть вас в этом сообществе. Я просто хотел бы отметить, что это сообщество зависит от голосов , чтобы продолжать функционировать. Голоса не только помогают сортировать ответы, но и формируют сайт, изменяя то, что видно, результаты поиска и, что самое важное, помогают держать хороших пользователей в поле зрения. Без голосов он умирает. Всего подано 3 голоса. Вам дают 30, чтобы использовать каждый день! Пожалуйста, рассмотрите возможность использования своих знаний для улучшения этого сайта, проголосовав за то, что вы считаете ценным или нет.
Калеб
@Caleb: Спасибо. Это в репозитории Ubuntu как libdate-manip-perl... @ Стивен Притчард: Это хорошее решение ... Спасибо.
Peter.O
1
У даты GNU есть и синтаксический анализ, и печать, но July 29th, 2011она не является общепризнанным форматом ( July 29, 2011работает), и вам нужно было бы добавить немало инфраструктуры shell и sed / awk.
Жиль "ТАК - перестать быть злым"