如何从Perl中的文件名中删除时间戳?

时间:2010-02-19 11:55:28

标签: perl

我有一个文件,其中有一行:

 /hosting/logs/U01-ecom-SIT01/CU01-DC05-IFIO_SIT01_NU01-nc3sz1ecmas11/waslogs/SystemOut_10.01.21_16.54.18.log`

我需要一个脚本来读取这一行并从中删除时间戳,即:

 10.01.21_16.54.18

脚本应该打印没有时间戳的文件名并保持完整路径,即:

 /hosting/logs/U01-ecom-SIT01/CU01-DC05-IFIO_SIT01_NU01-nc3sz1ecmas11/waslogs/SystemOut.log`

请帮忙,因为我无法模式匹配并输出没有时间戳的文件路径。

5 个答案:

答案 0 :(得分:1)

echo "/hosting/logs/U01-ecom-SIT01/CU01-DC05-IFIO_SIT01_NU01-nc3sz1ecmas11/waslogs/SystemOut_10.01.21_16.54.18.log" | 
  perl -pe "s/_\d\d\.\d\d\.\d\d_\d\d\.\d\d\.\d\d//;"

答案 1 :(得分:1)

$ perl -e 's{_\d{2}\.\d{2}.\d{2}_\d{2}\.\d{2}.\d{2}}{} and print for @ARGV' /hosting/logs/U01-ecom-SIT01/CU01-DC05-IFIO_SIT01_NU01-nc3sz1ecmas11/waslogs/SystemOut_10.01.21_16.54.18.log

答案 2 :(得分:1)

路径缩短以防止滚动:

$ cat paths
CU01-DC05-IFIO_SIT01_NU01-nc3sz1ecmas11/waslogs/SystemOut_10.01.21_16.54.18.log

$ perl -pe 's/(_(\d\d(\.\d\d){2})){2}\.log$/.log/' paths
CU01-DC05-IFIO_SIT01_NU01-nc3sz1ecmas11/waslogs/SystemOut.log

时间戳由2个看起来像_##.##.##的序列组成。子序列以.##的2个序列结束。这些是{2}量词的作用。

答案 3 :(得分:0)

while(<>){
    @s = split /\// ;
    $fullpath=join("/",splice @s , 0, $#s);
    @a = split /[_.]/ ,$s[-1];
    $newfile="$fullpath/$a[0].$a[-1]";
    print $newfile."\n";
}

答案 4 :(得分:0)

您可以使用以下编码

 use strict;
    use warnings;
  my $var; $var=/hosting/logs/U01-ecom-SIT01/CU01-DC05-IFIO_SIT01_NU01-nc3sz1ecmas11/waslogs/SystemOut_10.01.21_16.54.18.log";
    $var=~s/_\d\d\.\d\d\.\d\d//g;
    # $var=~s/_10\.01\.21_16\.54\.18//g; # You can use this way also 
    print "$var\n";