0

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

例如:

  • 旧文件名: /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 可以是数字。

4

3 回答 3

2
$Fname =~ s|^/external||;  # Remove leading "external" from path
$Fname =~ s|\.\d{8}$||;    # Remove date from end of filename
于 2012-09-24T16:12:10.110 回答
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.
于 2012-09-24T16:03:55.240 回答
1

试试这个捕获你需要的文本的正则表达式$1

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

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

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

正则表达式分解:

  • ^\/匹配行首后跟正斜杠(转义)
  • [^/]+匹配所有文本,直到找到下一个正斜杠(标记结束/external
  • (.*?)匹配并非贪婪地捕获您需要的所有文本,直到找到模式的最后一个
  • \.\d{8}$匹配最后一个句点,后跟 8 位日期,然后是行尾
于 2012-09-24T16:15:20.273 回答