我想就地编辑ssd_config文件,其中我需要将#Port替换为自定义端口。
之前:
#Port <portnum>
ex: #Port 22
之后:
Port <customport>
ex: Port 2022
这里的自定义端口是一个变量$port。
我尝试了下面的脚本,但什么都没有做。
my $prt = "Port 2022";
my $cmd = "sed -i \'s/#Port [0-9]\+/$prt/g\' sshd_config";
system($cmd);
已尝试使用刻度运算符。
`sed -i \"s/#Port [0-9]\+/\$prt/g\" sshd_config`;
3条答案
按热度按时间u5i3ibmn1#
我建议在运行Perl程序时,在Perl中执行所有这些操作。这样就不必运行外部程序,更不用说如果您确实需要shell(但在所示示例中不是这样),则不必处理所有的引用和转义。
然后我们还需要几行代码,来读取文件并编辑其内容,然后将其写回。考虑到所有的好处,这应该不重要--但有些库甚至可以删除这些内容,例如非常方便的Path::Tiny
我认为
$filename
和$prt
已经在程序的前面介绍过了。还有一个
edit
方法,它会抓取整个文件。roejwanj2#
sed能做的任何事情,Perl都能做。
如果这是整个Perl程序:
然后,您就可以从命令行在Perl中完成这一切。
xuo3flqw3#
system("sed ....")
正在调用shell来解析命令行,这意味着一切都需要根据shell的规则进行正确的转义。这与Perl内部的字符串转义一起使其很难正确。一个更简单的方法是跳过shell直接调用sed
,并使用字符串连接将$prt
添加到正确的位置(不要忘记还包括“Port”字符串本身,因为您希望在输出中包含它):或者,也可以直接在Perl中执行此操作,例如:
这是一个有点长,但不依赖于启动外部程序,因此速度更快。如果有更多的事情要做,而不是简单的替换,它也更灵活。