如何使用正则表达式从Perl中的文件名中删除最后6位数字

时间:2014-07-24 17:36:35

标签: regex perl

我需要你帮助创建一个正则表达式来删除文件名中的hh:hh:ss位。

我的文件名格式为:

  

abcd_efgh_ijkl_mnop_20140720151617.txt

我想将其重命名为:

  

abcd_efgh_ijkl_mnop_20140720.txt

在将其移至服务器之前。我正在使用的Perl代码不起作用。由于脚本要求,我无法使用SUBSTR或重命名函数。

$file_name = @file_array;
$file_name =~s/$\s+\d{8}(.*)/$1/;

请帮我创建正确的正则表达式。

5 个答案:

答案 0 :(得分:3)

不要专注于你不想要的东西,而是指定一个正则表达你想要的东西。

在这种情况下,您特别希望保留数字的前8位数并截断其余数字:

use strict;
use warnings;

while (<DATA>) {
    s/\d{8}\K\d+//;
    print;
}

__DATA__
abcd_efgh_ijkl_mnop_20140720151617.txt

输出:

abcd_efgh_ijkl_mnop_20140720.txt

或者如果因为你正在使用一个特别古老的perl版本而不能选择正面的后观断言,那么捕获组可以获得相同的结果:s/(\d{8})\d+/$1/;

答案 1 :(得分:0)

试试这个:

$filename="abcd_efgh_ijkl_mnop_20140720151617.txt";
$filename=~s/\d{6}.txt$/.txt/sg;

答案 2 :(得分:0)

您可以尝试以下perl命令,

$ echo 'abcd_efgh_ijkl_mnop_20140720151617.txt' | perl -pe 's/^(.*).{6}(\..*)$/\1\2/g'
abcd_efgh_ijkl_mnop_20140720.txt

所以它会是,

$file_name =~s/^(.*).{6}(\..*)$/$1$2/g;

答案 3 :(得分:0)

my $in = 'abcd_efgh_ijkl_mnop_20140720151617.txt';

print "$in\n";

my ($new) = $in =~ /(.*2014\d{4})/;

print "$new\n";

答案 4 :(得分:0)

尝试非贪婪方式

$file_name = 'abcd_efgh_ijkl_mnop_20140720151617.txt';
$file_name =~s/(.*?)\d{6}\.txt/$1.txt/;

print $file_name;