HI,
我有一个看起来像
/dir/dir1/filename.txt
我想用其他名称替换“filename.txt”,使“/ dir / dir1”保持不变 所以在替换后,字符串看起来像
/dir/dir1/newfilename.txt
考虑到我不知道“filename”的值,我如何在Perl中使用RegExp呢?
非常感谢
P.S:“filename.txt”和“newfilename.txt”用于在询问原始文件名不同的问题时使事情变得简单。
答案 0 :(得分:11)
我建议不要使用正则表达式来摆弄文件名/路径。目录分隔符,有效/无效字符因平台而异,可能是一个需要解决的问题。我建议你尝试File::Spec提取文件名,然后用你想要的任何内容替换它
答案 1 :(得分:10)
正则表达式是您的问题的错误工具。正则表达式很棒,大部分时间都可以使用,但并不总是最干净(可读性)或最快的解决方案。
我建议使用经典的File::Basename。与File :: Spec相比,File :: Basename是一个核心模块(无需安装!)并且非常易于使用:
use File::Basename;
my $basename = basename($fullname,@suffixlist);
my $dirname = dirname($fullname);
我最喜欢的用途:
my $filename = basename($path);
答案 2 :(得分:7)
$filename =~ s%/[^/]*$%/newfilename.txt%;
s%...%...%
- 使用%
作为分隔符,因此您可以在模式中使用/
/
- 匹配斜杠[^/]*
- 以及任何不包含斜杠的字符串$
- 直到字符串答案 3 :(得分:1)
尝试这样的事情......
#!/usr/bin/perl
use strict;
my $string = "/dir/dir1/filename.txt";
my @string = split /\//, $string;
$string[-1] = "newfilename.txt";
print join "/", @string;