我正在编写一个脚本,使用正则表达式截断文件的所有扩展,如下所示,但它看起来效果不好,因为这个命令确实删除了我想要的一些数据,因为它基本上会删除所有内容一个点。
我目前使用的正则表达式: -
/\..*?$/
它会删除一些像
这样的文件b10_120.00c.current.all --> b10_120
abc_10.77.log.bac.temp.ls --> abc_10
但我正在寻找b10_120.00c
和abc_10.77
除此之外,有没有办法打印输出,例如它只保留某些扩展名?例如,对于上述两个示例,它将显示b10_120.00c.current
和abc_10.77.log
。非常感谢你。
答案 0 :(得分:4)
以下将删除文件扩展名:
s/\.[^.]+$//;
\.
与文字.
匹配
[^.]+
匹配不是.
的每个字符
$
直到字符串结尾
my ($new_file_name) = ( $file_name =~ m/^( [^.]+ \. [^.]+ )/x );
^
锚点在字符串的开头
[^.]+
匹配不是.
的每个字符
\.
与文字.
匹配
[^.]+
匹配不是.
#!/usr/bin/env perl
use strict;
use warnings;
use Test::More 'tests' => 2;
my %file_name_map = (
'b10_120.00c.current.all' => 'b10_120.00c',
'abc_10.77.log.bac.temp.ls' => 'abc_10.77',
);
sub new_file_name {
my $file_name = shift;
my ($new_file_name) = ( $file_name =~ m/^( [^.]+ \. [^.]+ )/x );
return $new_file_name;
}
for my $file_name ( keys %file_name_map ) {
is $file_name_map{$file_name}, new_file_name($file_name),
"Got $file_name_map{$file_name}";
}
答案 1 :(得分:2)
$file =~ s/(\.[^.]+).*/$1/; # SO requires 30 chars in answer, that is stupid
答案 2 :(得分:0)
您应该使用\.
作为正则表达式中的点。
另外,请详细说明如何处理文件名。
答案 3 :(得分:-1)
我建议使用这个包而不是正则表达式: http://perldoc.perl.org/File/Basename.html