Как использовать sed с переменными, кавычками, косой чертой и обратными косыми чертами в сценарии perl? - PullRequest
0 голосов
/ 29 февраля 2020

У меня есть этот путь / home / myname / dir1 / dir2 / case_33, сохраненный как

my $pathtowdir = pwd

Я сохранил case_33 как

my $foldername = 'basename pwd'

Тогда у меня есть эта команда

system("sed -i 's+case_.*/+$foldername/+g' file.mcr");

file.mcr содержит строку, которая говорит:

/ home / myname / dir1 / dir2 / case_55 / anotherfile. дата

Мне нужно заменить case_55 на case_33. Я ожидал, что вышеупомянутая команда сделает это. Я предположил «case _. * /», Который эквивалентен «case_55 /» из файла, и заменил на «$ foldername /», что эквивалентно «case_33 /». Однако этого не произошло. «Дело_55» осталось. Любая помощь в том, что мне не хватает, приветствуется.

Спасибо

1 Ответ

3 голосов
/ 29 февраля 2020

pwd не является функцией Perl. 'basename pwd' не запускает команду, это просто строка.

Обычно нет необходимости вызывать sed из Perl, так как Perl может выполнить подстановку самостоятельно. Запуск новой оболочки может быть медленнее, чем выполнение всего из Perl.

#!/usr/bin/perl
use warnings;
use strict;
use 5.014; # /r

use Cwd qw{ getcwd };
use File::Basename qw{ basename };

my $pathtowdir = getcwd();
my $foldername = basename($pathtowdir);

open my $mcr, '<', 'file.mcr' or die $!;
open my $out, '>', 'file.mcr.new' or die $!;
print {$out} s{case_.*/}{$foldername/}gr while <$mcr>;
close $out;
rename 'file.mcr.new', 'file.mcr' or die $!;

Если вы можете устанавливать модули из CPAN, я бы порекомендовал Path :: Tiny , который вы можете используйте вместо Cwd и File :: Basename .

...