Perl正则表达式修改文件名

时间:2012-09-24 16:00:02

标签: regex perl

我正在尝试删除Ist部分和文件名的最后一部分。 我的文件名如/external/prop/new/test/File.Name.will.BE.this.extension.date 我想删除目录的第一部分(/external)和文件扩展名的最后一部分(.date),这样我的输出文件名就是/prop/new/test/File.Name.will.BE.this.extension

例如:

  • OLD FILE名称:/external/prop/new/test/FACL.Prop.for.BBG.txt.09242012
  • 新文件名:/prop/new/test/FACL.Prop.for.BBG.txt

  • 旧文件名称:/external/prop/old/test/set2/FACL.Prop.FITCH.csv.09242012

  • 新文件名:/prop/old/test/set2/FACL.Prop.FITCH.csv

我曾尝试过像

这样的东西
my($FinalName, $Finalextension) = split /\.(?!.*\.)/, substr($Fname,$Flength);

但它没有多大帮助。

/external将始终保持不变,但日期将始终有所不同,我不能只删除数字,因为.extension可以是数字。

3 个答案:

答案 0 :(得分:2)

$Fname =~ s|^/external||;  # Remove leading "external" from path
$Fname =~ s|\.\d{8}$||;    # Remove date from end of filename

答案 1 :(得分:1)

my $qfn = '/external/prop/new/test/FACL.Prop.for.BBG.txt.09242012';
$qfn =~ s{\.[^.]*\z}{};  # Remove last "extension".
$qfn =~ s{^/[^/]+}{};    # Remove first part of path.

答案 2 :(得分:1)

尝试使用此正则表达式捕获$1中所需的文本:

^\/[^/]+(.*?)\.\d{8}$

这假定您的日期总是8个数字。您可以使用适当的日期正则表达式替换最后\d{8}

这可以在RegExr here中进行测试。

正则表达式分手:

  • ^\/匹配行的开头,后跟正斜杠 (转义)
  • [^/]+匹配所有文本,直到找到下一个正斜杠(to 标记/external
  • 的结尾
  • (.*?)匹配AND捕获非贪婪的所有文本,直到找到最后一个模式
  • \.\d{8}$匹配最后一个句点,后跟8位数日期,后跟行尾