使用sed替换perl中的行

时间:2013-06-25 16:40:29

标签: 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 expected at ./attack.pl line 135, near 
""sed -i '168s'/.*'/redir_command_on = "iptables"

我认为这与特殊角色和逃脱有关。

2 个答案:

答案 0 :(得分:5)

所以Perl正在解析,它找到一个字符串文字

system ("sed -i '168s/.*/redir_command_on = "
        ^                                   ^
        |                                   |
        +-----------------------------------+

下一步应该是)还是运营商,但它是iptables。您没有正确形成字符串文字。切换分隔符将起到作用:

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

q{...}'...'相同。)

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

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

答案 1 :(得分:1)

您不能在双引号字符串中嵌套双引号。 Perl有更多quoting operators你可以使用。

# 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});
#-------^^------------------------------------------------------------------------------------------------------------------------------------------------^