使用sed替换perl中的行

use*_*951 0 perl system sed

我想取消注释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");
Run Code Online (Sandbox Code Playgroud)

错误是:

Bareword found where operator expected at ./attack.pl line 135, near 
""sed -i '168s'/.*'/redir_command_on = "iptables"
Run Code Online (Sandbox Code Playgroud)

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

ike*_*ami 5

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

system ("sed -i '168s/.*/redir_command_on = "
        ^                                   ^
        |                                   |
        +-----------------------------------+
Run Code Online (Sandbox Code Playgroud)

接下来应该是什么)或运营商,但它是iptables.您没有正确形成字符串文字.切换分隔符可以解决这个问题:

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

(q{...}'...'.一样.)

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

system('sed', '-i', '168s/.*/redir_command_on = "..."/', '/etc/etter.conf')
Run Code Online (Sandbox Code Playgroud)