Aus den Antworten habe ich die Frage aktualisiert:
Jetzt ist es:
$ date "+%F %H:%M"
2014-06-04 11:26
Dies ist die Eingabe:
$ 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>
Dies ist das aktuelle Perl-Skript (das SUPER funktioniert!, es fehlen nur noch Stunden/Minuten)
$ 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
Und jetzt wird diese Ausgabe erzeugt:
$ 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>
Unsere Frage: Wie können wir vergangene Daten – auch die Stunden:Minuten! – rot markieren? Die aktuelle Perl-Lösung muss aktualisiert werden, da sie „2014-06-04 11:23“ nicht rot markiert, es sich aber um ein vergangenes Datum handelt!
ps: - mehrere Daten können in einer Zeile stehen - das funktioniert
- vergangene Tage sind rot markiert - das funktioniert
- ich habe versucht, "datetime" statt "ymd" zu verwenden (http://perldoc.perl.org/Time/Piece.html) - hat aber nicht funktioniert, wahrscheinlich liegt es daran, dass in der input.txt " " statt "\t" steht? - +nur eine Anmerkung, ich habe bereits herausgefunden, wie man morgen markiert:
sed -i "s/<td>\(`date +%F -d '+1 day'`\)/<td><font style=BACKGROUND-COLOR:lightgreen>\1<\/font>/g" in.txt
Antwort1
Eine andere perl
Lösung: Verwenden Sie Time::Piece
ein Modul wie in der Antwort von @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
Aktualisieren
Wenn Sie mehrere vergangene Daten in einer Zeile haben, versuchen Sie:
$ 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>
Erläuterung
- Wir speichern alle Daten in einer Zeile im
@days
Array. - Wir prüfen bei jedem Datum, ob es vor dem heutigen Datum liegt, und ersetzen es dann.
Antwort2
Perl-Lösung:
< 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
}'
Im Grunde ist die ymd
Methode derUhrgibt das aktuelle Datum im erwarteten Format zurück. Sie können dann einen einfachen Zeichenfolgenvergleich verwenden, um vergangene Daten abzurufen.
AKTUALISIEREN: Um mehrere Daten pro Zeile zu verarbeiten, müssen Sie den Code ändern:
< 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;
}'