简体   繁体   中英

How to pass a variable line number in sed substitute command

I am trying to do a sed operation like this

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

I wanted 100 in a variable say $var from a perl script. So, I am trying like this

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

This is throwing some error.

Again when I am doing like this putting system command in single quotes:

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

this is substituting wrongly. What can be done?

Better and safer is to use the LIST variant of system , because it avoids unsafe shell command line parsing. The command, sed in your case, will receive the command line arguments un-alterated and without the need to quote them.

NOTE: I added -MO=Deparse just to illustrate what the one-liner compiles to.

NOTE: I added -e to be on the safe side as you have -i on the command line which expects a parameter.

 $ 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

Of course in reality it would be easier just to do the processing in Perl itself instead of calling sed ...

Shelling out to sed from within perl is a road to unnecessary pain. You're introducing additional quoting and variable expansion layers, and that's at best making your code less clear, and at worst introducing bugs accidentally.

Why not just do it in native perl which is considerably more effective. Perl even allows you to do in place editing if you want.

But it's as simple as:

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

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

Or if you're really keen on the in place edit, you can look into setting `$^I:

Perl in place editing within a script (rather than one liner)

But I'd suggest 'just' renaming the file after you're done is as easy.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM