回答に基づいて質問を更新しました:
さて、それは:
$ 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" を赤でマークしませんが、これは過去の日付です。そのため、更新する必要があります。
追記: - 複数の日付を 1 行に表示できます - これは機能しています
- 過去の日付は赤でマークされています - これは機能しています
- 「ymd」の代わりに「datetime」を使用しようとしました (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
アップデート
1 行に過去の日付が複数ある場合は、次を試してください。
$ 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>
説明
- すべての日付を配列内の 1 行に保存します
@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
基本的に、時間::ピース現在の日付を期待される形式で返します。その後、単純な文字列比較を使用して過去の日付を取得できます。
アップデート: 1 行に複数の日付を処理するには、コードを変更する必要があります。
< 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;
}'