簡體   English   中英

如何在sed替代命令中傳遞可變行號

[英]How to pass a variable line number in sed substitute command

我正在嘗試像這樣進行sed操作

sed -i '100s/abc/xyz/' filename.txt

我想從perl腳本中的變量$ var中輸入100。 所以,我正在嘗試這樣

system("sed -i "${vars}s/abc/xyz/" filename.txt"). 

這引發了一些錯誤。

同樣,當我這樣做時,將系統命令放在單引號中:

system('sed -i "${vars}s/abc/xyz/" filename.txt')

這是錯誤的替代。 該怎么辦?

更好和更安全的是使用system的LIST變體,因為它避免了不安全的Shell命令行解析。 在您的情況下, sed命令將接收未更改且無需引用它們的命令行參數。

注意:我添加了-MO=Deparse只是為了說明-MO=Deparse編譯到的內容。

注意:我添加-e安全考慮,因為在命令行中有-i需要參數。

 $ perl -MO=Deparse -e 'system(qw{sed -i -e}, "${vars}s/abc/xyz/", qw{filename.txt})'
 system(('sed', '-i', '-e'), "${vars}s/abc/xyz/", 'filename.txt');
 -e syntax OK

當然,實際上,僅在Perl中進行處理而不是調用sed會更容易。

脫殼出來sed從內部perl是不必要的痛苦的道路。 您將引入其他引號和變量擴展層,這充其量只能使您的代碼不太清楚,而最壞的情況是意外地引入了錯誤。

為什么不只是在原生perl這樣做呢? 如果需要,Perl甚至允許您進行就地編輯。

但這很簡單:

open ( my $input, '<', 'filename.txt'); 
open ( my $output, '>', 'filename.txt.new'); 

select $output; 
while ( <$input> ) {
   if ( $. == $vars ) { 
       s/abc/xyz/
   }
   print;
 }

或者,如果您真的很喜歡就地編輯,則可以考慮設置`$ ^ I:

在腳本中進行Perl編輯(而不是一個划線)

但是我建議完成后“只是”重命名文件就很容易了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM