2009-05-13 4 views
1

HI,
У меня есть строка, которая выглядит какКак заменить часть строки с помощью regexp?

/dir/dir1/filename.txt 

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

/dir/dir1/newfilename.txt 

как бы я сделать это с помощью RegExp в Perl, учитывая, что я не знаю значение «имя файла»

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

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

ответ

7
$filename =~ s%/[^/]*$%/newfilename.txt%; 
  • s%...%...% - использовать % в качестве разделителя, так что вы можете использовать / в шаблоне
  • / - соответствует слэш
  • [^/]* - и любую строку, не содержащую слеш
  • $ - до конца строки
+0

@Alnitak большое спасибо за ваш ответ, еще одна вещь, пожалуйста, если я просто хотел, чтобы извлечь «filename.txt» из «/dir/dir1/filename.txt» вместо того, чтобы заменить его , что бы я использовал в regexp –

+0

use «if ($ filename = ~ m% ...%)» и оберните исходный бит [^ /] * скобками {i.e. ([^ /] *)}, а затем он будет доступен как $ 1 – Alnitak

11

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

10

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

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

use File::Basename; 

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

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

my $filename = basename($path); 
1

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

#!/usr/bin/perl 

use strict; 

my $string = "/dir/dir1/filename.txt"; 
my @string = split /\//, $string; 
$string[-1] = "newfilename.txt"; 
print join "/", @string; 
Смежные вопросы