【问题标题】:How to use sed with variables, quotes, forward slashes and backticks in a perl script?如何在 perl 脚本中将 sed 与变量、引号、正斜杠和反引号一起使用?
【发布时间】:2020-06-13 14:22:29
【问题描述】:

我将此路径 /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/”,并替换为相当于“case_33/”的“$foldername/”。但是,这并没有发生。 “case_55”仍然存在。感谢您对我所缺少的任何帮助。

谢谢

【问题讨论】:

    标签: bash perl sed


    【解决方案1】:

    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 代替 CwdFile::Basename

    【讨论】:

    • 如果 OP 不想安装额外的模块,还有核心的 CwdFile::Basename 模块。
    • 有一天,我将不得不放弃并转而使用 Path::Tiny 来处理所有问题。
    猜你喜欢
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 2022-01-27
    • 2014-09-25
    • 2014-06-19
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多