全球替代
Global Substitution
您好,我正在使用以下代码替换日期格式,但我无法弄清楚如何全局更改所有日期。目前,该脚本可以正确查找并替换日期,但它只对一行中找到的第一个日期执行此操作,而跳过该行的其余部分。因此,如果在同一行中有另一个日期需要更改,它会忽略它。我尝试使用全局替换但无济于事。如果有人能给我一个想法,我将不胜感激。
use strict;
use Time::Piece ();
my $file = $ARGV[0];
open FILE, $file or die;
while ( my $line = <FILE> ) {
chomp $line;
my ($date) = $line =~ m/([A-Z][a-z][a-z] [ \d]{2} \d{4} \d{2}:\d{2}[AP]M)/;
if ($date eq ''){
print "$line\n";
next;
}
my $new_dt = Time::Piece->strptime($date, '%b %d %Y %H:%M%p')->strftime('%Y-%m-%d %H:%M:%S');
$line =~ s/$date/$new_dt/g;
print "$line\n";
}
close FILE;
print "\n";
编辑:添加示例
输入:
2007 年 5 月 15 日 12:00AM, , 1, 0, 2003 年 2 月 2 日 12:00PM
输出:
2007-05-15 00:00:00, , 1, 0, 2003 年 2 月 2 日 12:00PM
您正在替换与该行的第一个日期时间相同的所有日期时间。您甚至不会尝试查找任何其他日期时间。
while (<>) {
s{([A-Z][a-z][a-z] [ \d]\d \d{4} \d{2}:\d{2}[AP]M)}{
Time::Piece->strptime(, '%b %d %Y %I:%M%p')->strftime('%Y-%m-%d %H:%M:%S')
}eg;
print;
}
事实证明,您为问题选择的主题非常合适:)
注意:我将 %H
(小时为 0..23)更改为比 %I
(小时为 1..12)更合适。
您好,我正在使用以下代码替换日期格式,但我无法弄清楚如何全局更改所有日期。目前,该脚本可以正确查找并替换日期,但它只对一行中找到的第一个日期执行此操作,而跳过该行的其余部分。因此,如果在同一行中有另一个日期需要更改,它会忽略它。我尝试使用全局替换但无济于事。如果有人能给我一个想法,我将不胜感激。
use strict;
use Time::Piece ();
my $file = $ARGV[0];
open FILE, $file or die;
while ( my $line = <FILE> ) {
chomp $line;
my ($date) = $line =~ m/([A-Z][a-z][a-z] [ \d]{2} \d{4} \d{2}:\d{2}[AP]M)/;
if ($date eq ''){
print "$line\n";
next;
}
my $new_dt = Time::Piece->strptime($date, '%b %d %Y %H:%M%p')->strftime('%Y-%m-%d %H:%M:%S');
$line =~ s/$date/$new_dt/g;
print "$line\n";
}
close FILE;
print "\n";
编辑:添加示例
输入:
2007 年 5 月 15 日 12:00AM, , 1, 0, 2003 年 2 月 2 日 12:00PM
输出:
2007-05-15 00:00:00, , 1, 0, 2003 年 2 月 2 日 12:00PM
您正在替换与该行的第一个日期时间相同的所有日期时间。您甚至不会尝试查找任何其他日期时间。
while (<>) {
s{([A-Z][a-z][a-z] [ \d]\d \d{4} \d{2}:\d{2}[AP]M)}{
Time::Piece->strptime(, '%b %d %Y %I:%M%p')->strftime('%Y-%m-%d %H:%M:%S')
}eg;
print;
}
事实证明,您为问题选择的主题非常合适:)
注意:我将 %H
(小时为 0..23)更改为比 %I
(小时为 1..12)更合适。