我需要你帮助创建一个正则表达式来删除文件名中的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/;
请帮我创建正确的正则表达式。
答案 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;