【问题标题】:How do I pass $SHELL variable into a perl search and replace如何将 $SHELL 变量传递到 perl 搜索和替换
【发布时间】:2014-05-24 23:22:46
【问题描述】:

我有以下两个命令:

value=`grep -o Logs\/.*txt\" textFILE`
perl -i -wpe's/" onclick="img=document\.getElementById\('\''img_1'\''\); img\.style\.display = \(img\.style\.display == '\''none'\'' \? '\''block'\'' : '\''none'\''\);return false"/$value/' textFILE

但是,我不断收到Use of uninitialized value $value in concatenation (.) or string at -e line 1, <> line 56. 错误。谁能告诉我我做错了什么。

【问题讨论】:

  • 你不应该使用旧的反引号,改为括号value=$(grep .....)

标签: perl shell replace sed


【解决方案1】:

例如如下:

$ value=$(uname -r)
$ perl -e 'print "$value"'

当我们在这里运行 Perl 来执行我们的代码时,我们不会将 shell 变量 $value 的内容发送给 Perl。我们正在发送文字字符串“$value”,然后 Perl 将尝试打印不存在的 Perl 变量 $value。

这里有两种方法可以纠正这个问题。

第一种方法是将你的 Perl 代码用双引号而不是单引号括起来,这样当发送到 Perl 时,$value 就会成为 shell 变量 $value 的内容,而不是文字字符串 '$value':

$ value=$(uname -r)
$ perl -e "print '$value'"
3.13.9-generic

但是,当使用此方法时,如果您有 Perl 变量和这个 shell 变量,您将需要“转义”Perl 变量,否则您将收到如下错误:

$ value=$(uname -r)
$ perl -e "$example = 'test'; print \"$value $example\";"
syntax error at -e line 1, near "="

使用 \'s 将更正此问题:

$ value=$(uname -r)
$ perl -e "\$example = 'test'; print \"$value \$example\";"
3.13.9-generic test

其次,您可以通过将“值”导出到环境中来避免将单引号更改为双引号,然后通过 Perl 程序中已有的 %ENV 哈希 (http://perldoc.perl.org/Env.html) 访问它。例如:

$ export value=$(uname -r)
$ perl -e 'print "$ENV{value}\n"'
3.13.9-generic

请注意您的环境,不要意外覆盖某些需要的环境变量。使用非常适合您的工作的命名约定会有所帮助:

$ export MYPROGRAMNAME_KERNEL_VERSION=$(uname -r)
$ perl -e 'print "$ENV{MYPROGRAMNAME_KERNEL_VERSION}\n"'
3.13.9-generic

printenv 在大多数 Linux 系统上会显示当前已建立的环境变量。您也可以只使用 Perl 来检查 %ENV。

【讨论】:

    【解决方案2】:

    把你之前的两个问题,Why is my perl replace not working?How do I get a selection from the output of a grep 放在一起,我再次建议你只用 perl 来做。

    以下脚本接受文件名作为参数并读取它以获得第一个值,然后对其进行编辑以将第二个值替换为第一个值:

    use strict;
    use warnings;
    
    die "Usage: $0 Text_file\n" if @ARGV != 1;
    
    my ($file) = @ARGV;
    
    # Loop through file to find Value
    my $value;
    while (<>) {
        $value //= $1 if m{(Logs/.*?txt")};
    }
    
    die "Unable to find value in $file\n" if ! defined $value;
    
    # Loop through file to edit
    my $literal_string = q{ onclick="img=document.getElementById('img_1'); img.style.display = (img.style.display == 'none' ? 'block' : 'none');return false"};
    
    local @ARGV = $file;
    local $^I = '.bak';
    while (<>) {
        s/\Q$literal_string/$value/;
        print;
    }
    #unlink "$file$^I"; # Uncomment if you want to delete backup
    

    【讨论】:

      猜你喜欢
      • 2015-03-10
      • 1970-01-01
      • 2020-04-29
      • 1970-01-01
      • 2020-01-15
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      • 2017-01-05
      相关资源
      最近更新 更多