從答案中我更新了問題:
現在,它是:
$ 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 腳本(工作得很好!,只缺少幾小時/分鐘)
$ 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: - 多個日期可以在一行中 - 這是有效的
- 過去的日子標記為紅色 - 這是有效的
- 我嘗試使用“日期時間”而不是“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
答案1
另一個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
。 - 對於每個日期,我們檢查它是否小於今天,然後替換它。
答案2
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
方法是時間::零件以預期格式傳回目前日期。然後,您可以使用純字串比較來取得過去的日期。
更新:要每行處理多個日期,您必須更改程式碼:
< 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;
}'