Є кілька хороших натяків це відповідь пропонуючи шлях найменшого опору, використовуючи мови сценаріїв, такі як Perl, Python, Ruby і т.д., що дозволяє змішувати математичні операції та операції зіставлення.
Ось швидкий хак з Perl:
$ echo '2014-12-05 10:00:10, 1234, 2015-02-01 09:12:24' | perl -pe \
's/(\d{4}-\d{2}-\d{2} )(\d{2})(:\d{2}:\d{2})/join("",$1,$2+3,$3)/eg'
2014-12-05 13:00:10, 1234, 2015-02-01 12:12:24
$
У цьому спрощеному прикладі клас символів цифр ( \d
), за яким слід індикатор повторення (наприклад, {2}
) використовується для захоплення позиційних компонентів дати, і ми сліпо робимо арифметику на полі години. Цей тип рішення підходить тільки тоді, коли ви знаєте свої дані досить добре, щоб гарантувати, що спрощена арифметика в полі годин не призведе до перенесення дня.
Переглядаючи цю проблему, звертаючись до правильної арифметики дати / часу, коли полів годин переповнюється, як запропоновано @Lieven, модуль ядра Perl Time::Piece
(Perl & gt; 5,8) можна використовувати:
$ echo '2014-12-05 22:00:00, 1234, 2015-02-01 09:12:24' | \
perl -MTime::Piece -pe \
's/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/( \
Time::Piece->strptime($1, "%Y-%m-%d %T") \
+ (60*60*3))->strftime("%Y-%m-%d %T")/eg'
2014-12-06 01:00:00, 1234, 2015-02-01 12:12:24
$
Цей вхідний приклад було оновлено, щоб показати витончене керування значеннями годин, що переходять на наступний день. Це тягне в Time::Piece
Модуль в командному рядку, відповідає часу-дати від входу, перетворюється в Time::Piece
об'єктів, щоб виконати арифметику дати / часу, а потім повернути назад у потрібний формат виводу.