rahul
rahul

Reputation: 406

Perl - Insert lines after a match is found in a file

I have a file with the following syntax in some_1.xyz

module some_1 {
INPUT PINS
OUTPUT PINS
}

and I want to insert APPLY DELAYS xx and APPLY LOADS ld after line module some_1 {

The following code works fine for just one file i.e., if I replace some_1.xyz to *.xyz then the script doesn't work. I tried introducing sleep(xx) but the code doesn't work for multiple files and I could not figure out why it isn't working. Any pointers is appreciated. Thanks

@modulename_array = `grep "module " some_1.xyz | cut -f 2 -d ' '`;
@line = `grep "module " some_1.xyz`;

chomp(@line);
chomp(@kfarray);

$i = 0;
foreach (@modulename_array) {
  print "Applying delay and load to $_.xyz $line[$i] \n";

  `perl -ni -le 'print; print "\tAPPLY DELAY xx \n \tAPPLY LOADS  ld\n" if/$line[$i]/' $_.xyz`;
  $i++;
  #sleep(3);

}

Upvotes: 2

Views: 21345

Answers (5)

gaoithe
gaoithe

Reputation: 4398

one-liner

perl -pi -e '/module some_1/ and $_.="APPLY DELAY xx \nAPPLY LOADS  ld\n"' files*.txt

Upvotes: 4

conanDrum
conanDrum

Reputation: 215

$text='bla bla mytext bla bla';
$find='.*mytext.*';
$repl='replacement';

$text=~ s/($find)/$1$repl/g;

$1 is basically your match and you can use it when you make the replacement, either before or after your $repl string. )))

EASY

Upvotes: 1

Tommy Quiros
Tommy Quiros

Reputation: 51

Something much simpler, in just one line using SED (in case this question is for UNIX only and when the match is a fixed value, not regular expression):

sed -i -e "s/<match pattern>/<match pattern>\n<new line here>/g" file.txt

(The options have been swapped compared to the initial response, because the first comment.)

Notice the \n is to add a new line. Regards

Upvotes: 5

hlynur
hlynur

Reputation: 596

And what's wrong with the easy solution?:

$data=`cat /the/input/file`;
$data=~s/some_1 {\n/some_1 {\nAPPLY DELAYS xx\nAPPLY LOADS ld\n/gm;
print $data;

Upvotes: 3

robert
robert

Reputation: 34458

I have no idea why your code isn't working, but I have trouble following your use of Perl inside backticks inside Perl. This is untested, but should work. I suggest you also "use strict;" and "use warnings;".

my @files = ("some_1.xyz", "some_2.xyz", ... );
for my $file in ( @files )
{
    my $outfile = $file + ".tmp";
    open( my $ins, "<", $file ) or die("can't open " . $file . " for reading: " . $!);
    open( my $outs, ">", $outfile ) 
        or die("can't open " . $outfile . " for writing: " . $!);
    while ( my $line = <$ins> )
    {
        print { $outs } $line;
        if ( $line =~ m/^module\s+/ )
        {
             print { $outs } "\tAPPLY DELAY xx\n\tAPPLY LOADS ld\n";
        }
    }
    rename( $outfile, $file );
}

Upvotes: 0

Related Questions