A partir das respostas, atualizei a pergunta:
Agora é:
$ date "+%F %H:%M"
2014-06-04 11:26
Esta é a entrada:
$ 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>
Este é o script perl atual (que está funcionando MUITO bem!, faltam apenas horas/minutos)
$ 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
E agora, produz esta saída:
$ 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>
Nossa pergunta: Como podemos marcar as datas passadas - as horas:minutos também! - tão vermelho? A solução perl atual precisa ser atualizada, pois não marca "2014-06-04 11:23" em vermelho, mas é uma data passada!
ps: - várias datas podem estar em uma linha - isso está funcionando
- últimos dias marcados em vermelho - isso está funcionando
- tentei usar o "datetime" em vez de "ymd" (http://perldoc.perl.org/Time/Piece.html) - mas não funcionou, provavelmente por causa disso no input.txt há " " em vez de "\t"? - +só uma observação, já descobri como marcar amanhã:
sed -i "s/<td>\(`date +%F -d '+1 day'`\)/<td><font style=BACKGROUND-COLOR:lightgreen>\1<\/font>/g" in.txt
Responder1
Outra perl
solução, use Time::Piece
módulo como a resposta do @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
Atualizar
Se você tiver várias datas anteriores em uma linha, tente:
$ 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>
Explicação
- Salvamos todas as datas em uma linha do
@days
array. - Para cada data, verificamos se é menor que hoje e depois substituímos.
Responder2
Solução 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
}'
Basicamente, o ymd
método deRelógioretorna a data atual no formato esperado. Você pode então usar a comparação simples de strings para obter datas anteriores.
ATUALIZAR: Para processar múltiplas datas por linha, é necessário alterar o código:
< 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;
}'