我想在Perl脚本中执行下面的一行,以匹配一行与变量的值,owner
并type
从文件中删除它:
perl -i -ne\"print unless /\b${owner}\b/ and /\b${type}\b/;\" /tmp/test
内容/tmp/test
:
node01 A 10.10.10.2 node02 A 10.20.30.1
当我在shell中执行时,这完全正常,但在Perl脚本中也不起作用.
我曾尝试使用反引号,system
而且exec
.似乎没什么用.
`perl -i -ne\"print unless /\b${owner}\b/ and /\b${type}\b/;\" /tmp/test` system(q(perl -i -ne\"print unless /\b${owner}\b/ and /\b${type}\b/;\" /tmp/test));
是否可以在Perl脚本中执行Perl一个内衬?
如果是这样,我在这里做错了什么?
注意:我不需要使用sed,grep,awk等从文件中删除一行的解决方案.
您不希望从shell生成Perl代码,因此您将使用shell中的以下其中一项:
perl -i -ne' BEGIN { $owner = shift; $type = shift; } print unless /\b\Q$owner\E\b/ and /\b\Q$type\E\b/; ' "$owner" "$type" /tmp/test
要么
ARG_OWNER="$owner" ARG_TYPE="$type" perl -i -ne' print unless /\b\Q$ENV{ARG_OWNER}\E\b/ and /\b\Q$ENV{ARG_TYPE}\E\b/; ' /tmp/test
Perl等价物是
system('perl', '-i', '-n', '-e' => ' BEGIN { $owner = shift; $type = shift; } print unless /\b${owner}\b/ and /\b${type}\b/; ', $owner, $type, '/tmp/test', );
和
local $ENV{ARG_OWNER} = $owner; local $ENV{ARG_TYPE} = $type; system('perl', '-i', '-n', '-e' => 'print unless /\b\Q$ENV{ARG_OWNER}\E\b/ and /\b\Q$ENV{ARG_TYPE}\E\b/;', '/tmp/test', );