我将此路径/ 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.dat
我需要将“ case_55”替换为“ case_33”。我期望上面的命令能够做到这一点。我假设文件中的“ case _。* /”等效于“ case_55 /”,并替换为“ $ foldername /”,等效于“ case_33 /”。但是,这没有发生。 “ case_55”仍然存在。我对我所缺少的任何帮助表示赞赏。
谢谢
答案 0 :(得分:3)
pwd
不是Perl函数。 'basename pwd'
不运行命令,只是一个字符串。
通常不需要从Perl调用sed,因为Perl可以自己进行替换。运行新的Shell可能比在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。