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
使用sed替换perl中的行_Perl_Sed_System - Fatal编程技术网

使用sed替换perl中的行

使用sed替换perl中的行,perl,sed,system,Perl,Sed,System,我想取消对etter.conf文件第168行的注释。该命令在终端中运行正常,但在perl中尝试时出错 system ("sed -i '168s/.*/redir_command_on = "iptables -t nat -A PREROUTING -i %iface -p tcp --dport %port -j REDIRECT --to-port %rport"/' /etc/etter.conf"); 错误为: Bareword found where operator expect

我想取消对etter.conf文件第168行的注释。该命令在终端中运行正常,但在perl中尝试时出错

system ("sed -i '168s/.*/redir_command_on = "iptables -t nat -A PREROUTING -i %iface -p tcp --dport %port -j REDIRECT --to-port %rport"/' /etc/etter.conf");
错误为:

Bareword found where operator expected at ./attack.pl line 135, near 
""sed -i '168s'/.*'/redir_command_on = "iptables"

我认为is与特殊字符和转义符有关。

不能在双引号字符串中嵌套裸露的双引号。Perl提供了更多您可以使用的功能

# Instead of
system ("sed -i '168s/.*/redir_command_on = "iptables -t nat -A PREROUTING -i %iface -p tcp --dport %port -j REDIRECT --to-port %rport"/' /etc/etter.conf");

# use
system (q{sed -i '168s/.*/redir_command_on = "iptables -t nat -A PREROUTING -i %iface -p tcp --dport %port -j REDIRECT --to-port %rport"/' /etc/etter.conf});
#-------^^------------------------------------------------------------------------------------------------------------------------------------------------^

不能将空双引号嵌套在双引号字符串中。Perl提供了更多您可以使用的功能

# Instead of
system ("sed -i '168s/.*/redir_command_on = "iptables -t nat -A PREROUTING -i %iface -p tcp --dport %port -j REDIRECT --to-port %rport"/' /etc/etter.conf");

# use
system (q{sed -i '168s/.*/redir_command_on = "iptables -t nat -A PREROUTING -i %iface -p tcp --dport %port -j REDIRECT --to-port %rport"/' /etc/etter.conf});
#-------^^------------------------------------------------------------------------------------------------------------------------------------------------^

因此Perl正在进行解析,并找到一个字符串文本

system ("sed -i '168s/.*/redir_command_on = "
        ^                                   ^
        |                                   |
        +-----------------------------------+
接下来应该是
或操作员,但它是
iptables
。您没有正确地形成字符串文字。切换分隔符将达到以下目的:

system(q{sed -i '168s/.*/redir_command_on = "..."/' /etc/etter.conf})
q{…}
“…”
相同)

顺便说一下,对
系统
使用“列表形式”更好,因为它避免了不必要地启动和使用shell

system('sed', '-i', '168s/.*/redir_command_on = "..."/', '/etc/etter.conf')

因此Perl正在进行解析,并找到一个字符串文本

system ("sed -i '168s/.*/redir_command_on = "
        ^                                   ^
        |                                   |
        +-----------------------------------+
接下来应该是
或操作员,但它是
iptables
。您没有正确地形成字符串文字。切换分隔符将达到以下目的:

system(q{sed -i '168s/.*/redir_command_on = "..."/' /etc/etter.conf})
q{…}
“…”
相同)

顺便说一下,对
系统
使用“列表形式”更好,因为它避免了不必要地启动和使用shell

system('sed', '-i', '168s/.*/redir_command_on = "..."/', '/etc/etter.conf')

您需要转义嵌套的引号。Perl认为iptables应该是可变的。命令中的双引号正在终止Perl字符串。您为什么要使用
sed
?Perl完全能够自行更新文件。您甚至可以在Perl中进行“就地”编辑,完全不需要使用sed。您需要转义嵌套引号。Perl认为iptables应该是可变的。命令中的双引号正在终止Perl字符串。您为什么要使用
sed
?Perl完全可以自己更新一个文件。你甚至可以用Perl做“就地”编辑,完全不需要使用sed。很好,你也可以用
system(qw)替换
system(q{…
){…
自动获取列表表单。@steabert,不。您将获得一个列表,但它不是正确的命令。啊,因为有空格?@steabert,是的。
qw
在空格上拆分。它对shell文本一无所知。很好,您还可以用
system(qw)替换
system(q{…
){…
自动获取列表表单。@steabert,不。您将获得一个列表,但它不是正确的命令。啊,因为有空格?@steabert,是的。
qw
在空格上拆分。它对shell文本一无所知。