Как заменить часть строки с помощью регулярного выражения? - PullRequest
1 голос
/ 13 мая 2009

HI,
У меня есть строка, которая выглядит как

/dir/dir1/filename.txt

Я хочу заменить "filename.txt" на другое имя, оставив "/ dir / dir1" без изменений поэтому после замены строка будет выглядеть как

/dir/dir1/newfilename.txt

как мне это сделать, используя RegExp в Perl, учитывая, что я не знаю значения "filename"

Большое спасибо

P.S: «filename.txt» и «newfilename.txt» были использованы для упрощения при задании вопроса, оригинальное имя файла будет отличаться.

Ответы [ 4 ]

11 голосов
/ 13 мая 2009

Я бы не рекомендовал использовать регулярные выражения для манипулирования именами файлов / путями. Разделители каталогов, действительные / недействительные символы различаются в зависимости от платформы и могут стать проблемой для поиска. Я советую вам попробовать File :: Spec , чтобы извлечь имя файла, а затем заменить его на то, что вы хотите

10 голосов
/ 13 мая 2009

Регулярные выражения - неправильный инструмент для вашей проблемы. Регулярные выражения фантастичны, работают большую часть времени, но не всегда являются самым чистым (удобочитаемым) или самым быстрым решением.

Я бы предложил использовать классический File :: Basename . В отличие от File :: Spec, File :: Basename является основным модулем (ничего не устанавливается!) И действительно прост в использовании:

    use File::Basename;

    my $basename = basename($fullname,@suffixlist);
    my $dirname  = dirname($fullname);

Мое любимое использование:

    my $filename = basename($path);
7 голосов
/ 13 мая 2009
$filename =~ s%/[^/]*$%/newfilename.txt%;
  • s%...%...% - используйте % в качестве разделителя, поэтому вы можете использовать / в шаблоне
  • / - соответствует слешу
  • [^/]* - и любая строка, не содержащая косую черту
  • $ - до конца строки
1 голос
/ 14 мая 2009

Попробуйте что-то вроде этого ...

#!/usr/bin/perl

use strict;

my $string = "/dir/dir1/filename.txt";
my @string = split /\//, $string;
$string[-1] = "newfilename.txt";
print join "/", @string;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...