我想在需要將#Port 替換為自定義埠的地方編輯 ssd_config 檔案。
前:
#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`;
uj5u.com熱心網友回復:
我建議在運行 Perl 程式后在 Perl 中完成所有這些作業。這樣一來,就不必運行外部程式,更不用說如果您確實需要一個 shell(但在所示示例中沒有),就不必搞亂所有參考和轉義的好處。
然后我們需要幾行代碼來讀取檔案并編輯其內容并將其寫回。考慮到所有的好處,這應該沒關系——但也有一些庫甚至可以去掉這些,例如非常方便的Path::Tiny
use Path::Tiny;
...
path($filename)->edit_lines( sub { s/#Port [0-9] /Port $prt/ } );
我認為它$filename并$prt已在程式的前面介紹過。
還有一種edit方法,可以吞食整個檔案。
uj5u.com熱心網友回復:
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
uj5u.com熱心網友回復:
system("sed ....")是呼叫一個shell來決議命令列,這意味著一切都需要根據shell的規則進行適當的轉義。這與 Perl 中的字串轉義一起使得很難正確處理。一個更簡單的方法是跳過shell并sed直接呼叫,并使用字串連接$prt在正確的位置添加(并且不要忘記還包括“埠”字串本身,因為您希望將它包含在輸出中):
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);
這有點長,但不依賴于啟動外部程式,因此速度更快。如果要做的不僅僅是簡單的替換,它也更靈活。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/524269.html
標籤:perlsed
上一篇:在Perl中,您可以在沒有`AUTOLOAD`的情況下子類化和掛鉤所有父類函式嗎?
下一篇:跟隨指標和偏移算術
