在perl中使用变量调用sed

a64a0gku  于 2022-11-15  发布在  Perl
关注(0)|答案(3)|浏览(363)

我想就地编辑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`;
u5i3ibmn

u5i3ibmn1#

我建议在运行Perl程序时,在Perl中执行所有这些操作。这样就不必运行外部程序,更不用说如果您确实需要shell(但在所示示例中不是这样),则不必处理所有的引用和转义。
然后我们还需要几行代码,来读取文件并编辑其内容,然后将其写回。考虑到所有的好处,这应该不重要--但有些库甚至可以删除这些内容,例如非常方便的Path::Tiny

use Path::Tiny;

...

path($filename)->edit_lines( sub { s/#Port [0-9]+/Port $prt/ } );

我认为$filename$prt已经在程序的前面介绍过了。
还有一个edit方法,它会抓取整个文件。

roejwanj

roejwanj2#

sed能做的任何事情,Perl都能做。
如果这是整个Perl程序:

my $prt = "Port 2022";
my $cmd = "sed -i \'s/#Port [0-9]\+/$prt/g\' sshd_config";
system($cmd);

然后,您就可以从命令行在Perl中完成这一切。

perl -i -p -e's/#Port [0-9]+/Port 2022/g' sshd_config
xuo3flqw

xuo3flqw3#

system("sed ....")正在调用shell来解析命令行,这意味着一切都需要根据shell的规则进行正确的转义。这与Perl内部的字符串转义一起使其很难正确。一个更简单的方法是跳过shell直接调用sed,并使用字符串连接将$prt添加到正确的位置(不要忘记还包括“Port”字符串本身,因为您希望在输出中包含它):

system('sed','-i','s/#Port [0-9]+/Port ' . $prt . '/', 'sshd_config');

或者,也可以直接在Perl中执行此操作,例如:

open(my $fh,'<','sshd_config') or die $!;
 my @lines = map { s/#Port \d+/Port $prt/ } <$fh>;
 open($fh,'>','sshd_config') or die $!;
 print $fh @lines;
 close($fh);

这是一个有点长,但不依赖于启动外部程序,因此速度更快。如果有更多的事情要做,而不是简单的替换,它也更灵活。

相关问题