繁体   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