Как отметить даты, которые были в прошлом?

Из ответов я уточнил вопрос:

Теперь это:

$ date "+%F %H:%M" 2014-06-04 11:26 

Это вход:

 $ cat input.txt <tr><td>2014-04-24 14:01</td><td>2014-06-04 11:30</td><td>2014-06-04 11:23</td></tr> 

Это текущий скрипт perl (который работает GREAT !, только часы / минуты)

 $ cat a.txt perl -MTime::Piece -pe ' BEGIN {$today = localtime->ymd} @days = $_ =~ /<td>(.+?)<\/td>/g; for $d (@days) { $_ =~ s!$d!<font style=BACKGROUND-COLOR:red>$d</font>!g if $d lt $today; }' input.txt 

И теперь он производит этот вывод:

 $ bash a.txt <tr><td><font style=BACKGROUND-COLOR:red>2014-04-24 14:01</font></td><td>2014-06-04 11:30</td><td>2014-06-04 11:23</td></tr> 

Наш вопрос : как мы можем отметить прошлые даты – часы: минуты тоже! – как красный? Текущее решение perl необходимо обновить, так как оно не отмечает красную «2014-06-04 11:23», но это минута!

ps: – несколько дат могут быть в одной строке – это работает
– прошлые дни, отмеченные как красные, – которые работают
– Я пытался использовать «datetime» вместо «ymd» ( http://perldoc.perl.org/Time/Piece.html ) – но это не сработало, возможно, из-за этого в input.txt есть "" вместо "\ t"? – + просто заметка (если это помогает), я уже узнал, как отметить завтра:

 sed -i "s/<td>\(`date +%F -d '+1 day'`\)/<td><font style=BACKGROUND-COLOR:lightgreen>\1<\/font>/g" in.txt 

2 Solutions collect form web for “Как отметить даты, которые были в прошлом?”

Другое решение perl , используйте модуль Time::Piece например, ответ @ choroba:

 $ perl -MTime::Piece -pe ' BEGIN {$today = localtime->ymd." ".localtime->hms} s!($1)!<font style=BACKGROUND-COLOR:red>$1</font>!g if /<td>(.+?)<\/td>/g and $1 lt $today; ' in.txt asfsaf<td><font style=BACKGROUND-COLOR:red></font> kjycasfd FKZF<td>2014-05-09 lkjafsa sdfg<td>2014-05-13 asdf sfjlaslfsaljf <td><font style=BACKGROUND-COLOR:red></font> DIJIZLOF 

Обновить

Если у вас несколько последних дат в одной строке, попробуйте:

 $ perl -MTime::Piece -pe ' BEGIN {$today = localtime->ymd." ".localtime->hms} @days = $_ =~ /<td>(.+?)<\/td>/g; for $d (@days) { $_ =~ s!$d!<font style=BACKGROUND-COLOR:red>$d</font>! if $d lt $today; }' in.txt <tr><td><font style=BACKGROUND-COLOR:red>2014-04-24 00:01</font></td><td>2014-06-24 00:01</td><td><font style=BACKGROUND-COLOR:red>2014-05-13 00:00</font></td></tr> 

объяснение

  • Мы сохраняем всю дату в строке в массиве @days .
  • Для каждой даты мы проверяем, меньше ли это, чем сегодня, а затем замените ее.

Решение Perl:

 < in.txt perl -MTime::Piece -pe ' BEGIN { $t = localtime->ymd } if (/([0-9]{4}-[0-9]{2}-[0-9]{2})/ and $1 lt $t) { s=($1)=<red>$1</red>=g }' 

В принципе, метод ymd Time :: Piece возвращает текущую дату в ожидаемом формате. Затем вы можете использовать сравнение простых строк для получения дат.

ОБНОВЛЕНИЕ : для обработки нескольких дат в строке вам необходимо изменить код:

 < in.txt perl -MTime::Piece -pe ' BEGIN { $t = localtime->ymd } push @d, $1 while /([0-9]{4}-[0-9]{2}-[0-9]{2})/g; for my $d (@d) { $d lt $t and s=($d)=<red>$1</red>=g; }' 
  • Строка даты реформата
  • Обновить заголовок таблицы относительно имени файла
  • Извлечь столбец из полей, разделенных пробелами, которые не выровнены
  • используя awk для создания таблицы LaTex из моих данных в текстовом файле
  • Как вставить первый столбец во многие файлы + как преобразовать время unix в обычное время
  • Сравнить 2 столбца в 2 разных файлах
  • Как я могу напечатать условный заголовок до начала stdout, если есть какой-либо вывод на stdout
  • Подмножество содержимого файла на основе значения в столбце
  • Команда вырезания не извлекает поля правильно в выровненных столбцах
  • Как добавить новую строку для отсутствующей записи между двумя полями
  • Сценарий оболочки: текстовые файлы в массив
  • Linux и Unix - лучшая ОС в мире.