我的文字文件内容
vi /root/text.conf
node.session.auth.authmethod = hello
所以我的one liner perl命令通过#注释来替换上面的文件内容。以单一命令运行时工作正常
perl -pi -e 's/^(node.session.auth.authmethod\s*=\s*).*$/#\1hello/g' /root/text.conf
当perl脚本代码在perl脚本中执行时,它不会注释掉text.conf文件内容。
$cmd ="perl -pi -e 's/^(node.session.auth.authmethod\s*=\s*).*$/#\1hello/g' /root/text.conf"
$line = `$cmd 2>&1`;$ret = $?;
在Perl脚本中执行Perl one liner时,我遗漏了什么。
答案 0 :(得分:3)
是的,使用当前的perl进程而不是新的进程。这相当于你的
perl -pi -e 's/^(node.session.auth.authmethod\s*=\s*).*$/#\1hello/g' /root/text.conf
一衬垫,
use strict;
use warnings;
local $^I = "";
local @ARGV = "/root/text.conf";
while (<>) {
s/^(node.session.auth.authmethod\s*=\s*).*$/#\1hello/g;
print;
}
答案 1 :(得分:1)
定义$cmd
变量$/
将被其值(行分隔符)替换。然后正则表达式将与您的行匹配。
尝试使用单引号(以及正确的转义):
$cmd ='perl -pi -e \'s/^(node.session.auth.authmethod\s*=\s*).*$/#\1hello/g\' /root/text.conf'
$line = `$cmd 2>&1`;$ret = $?;
这将阻止perl扩展变量。
然而,mpapec的回答是正确的,为什么要求新流程?