我有以下两个命令:
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.
错误。有人能告诉我我做错了什么。
答案 0 :(得分:1)
对于以下示例:
$ value=$(uname -r)
$ perl -e 'print "$value"'
当我们运行Perl来执行我们的代码时,我们不会将shell变量$ value的内容发送给Perl。我们发送文字字符串&#39; $ value&#39;然后Perl将尝试打印不存在的Perl变量$ value。
以下两种方法可以解决这个问题。
第一个是用双引号而不是单引号包装你的Perl代码,这样$ value就成了shell变量$ value的内容,而不是文字字符串&#39; $ value&#39;发送到Perl时:
$ value=$(uname -r)
$ perl -e "print '$value'"
3.13.9-generic
然而,当你使用这个方法时,如果你有Perl变量和这个shell变量,你将需要逃避&#39; 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
其次,您可以通过导出&#34; value&#34;来避免将单引号更改为双引号。到环境,然后通过Perl程序(http://perldoc.perl.org/Env.html)中已有的%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。
答案 1 :(得分:0)
将您之前提到的两个问题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