Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将$SHELL变量传递到perl搜索和替换中_Perl_Shell_Replace_Sed - Fatal编程技术网

如何将$SHELL变量传递到perl搜索和替换中

如何将$SHELL变量传递到perl搜索和替换中,perl,shell,replace,sed,Perl,Shell,Replace,Sed,我有以下两个命令: 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 然

我有以下两个命令:

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

然而,我不断地得到一个
在串联(.)中使用未初始化值$value或-e第1行、第56行的字符串。
错误。有人能告诉我我做错了什么吗。

例如:

$ value=$(uname -r)
$ perl -e 'print "$value"'
当我们在这里运行Perl来执行代码时,我们并没有将shell变量$value的内容发送给Perl。我们正在发送文本字符串“$value”,然后Perl将尝试打印Perl变量$value,该变量不存在

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

第一种方法是将Perl代码用双引号而不是单引号括起来,以便$value在发送到Perl时成为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 "="
使用将纠正此问题:

$ value=$(uname -r)
$ perl -e "\$example = 'test'; print \"$value \$example\";"
3.13.9-generic test
其次,通过将“value”导出到环境中,然后通过Perl程序()中已有的%ENV散列访问它,可以避免将单引号更改为双引号。例如:

$ 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

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

将前面的两个问题放在一起,我将再次建议您使用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
使用严格;
使用警告;
如果@ARGV!=1.
我的($file)=@ARGV;
#循环文件以查找值
我的美元价值;
而(){
$value/=$1,如果m{(Logs/*?txt”)};
}
如果!定义了$value,则“无法在$file中找到值\n”;
#循环浏览要编辑的文件
my$literal_string=q{onclick=“img=document.getElementById('img_1');img.style.display=(img.style.display='none'?'block':'none');返回false“};
local@ARGV=$file;
本地$^I='.bak';
而(){
s/\Q$literal_string/$value/;
印刷品;
}
#取消链接“$file$^I”#如果要删除备份,请取消注释

您不应该使用旧的反勾号,改为括号
value=$(grep…)