kirk123 has asked for the wisdom of the Perl Monks concerning the following question:

Hi: How do you read from a file, match a string, make a copy of that string, update the copy, and add the copy back to the file. --kirk
  • Comment on Make a copy of a line and add it back to the same file

Replies are listed 'Best First'.
Re: Make a copy of a line and add it back to the same file
by valdez (Monsignor) on Aug 26, 2002 at 22:52 UTC

    Try Tie::File, here is a piece of its man page:

    # This file documents Tie::File version 0.93 tie @array, 'Tie::File', filename or die ...; $array[13] = 'blah'; # line 13 of the file is now 'blah' print $array[42]; # display line 42 of the file $n_recs = @array; # how many records are in the file? $#array -= 2; # chop two records off the end for (@array) { s/PERL/Perl/g; # Replace PERL with Perl everywhere in the fi +le } # These are just like regular push, pop, unshift, shift, and splice # Except that they modify the file in the way you would expect push @array, new recs...; my $r1 = pop @array; unshift @array, new recs...; my $r1 = shift @array; @old_recs = splice @array, 3, 7, new recs...; untie @array; # all finished

    Hope this helps, Valerio

      'course, if you're aiming for something a bit less complicated, there's always:
      perl -pi -e 's/old text/new text/' filename
      ...assuming, of course, that that's what you're trying to accomplish (the original question wasn't all that clear on that point)
        the_pusher_robot: Basically Iam reading a bunch of lines from a file. One of the line looks like: cdsadmin -t -O :c:\data"; I want to make a copy of this line, then change the the "-t" to "-d" in the copy. I then want to add this new line(copy) back to the file. The file now contains the original lines plus the new one.
Re: Make a copy of a line and add it back to the same file
by sauoq (Abbot) on Aug 26, 2002 at 23:49 UTC

    Where do you want to add the new (changed) piece of text? Immediately after the line you modified? At the end of the file? Somewhere else?

    A solution like the_pusher_robot's can probably be made to work for you. This might do the trick:

    perl -pi.bak -e 's/^cdsadmin\s+-t(.*)/${_}cdsadmin -d$1/' yourfile

    I do recommend providing an argument to -i in order to create a backup of the original otherwise a typo might ruin your whole day. ;-)

    -sauoq
    "My two cents aren't worth a dime.";
    
Re: Make a copy of a line and add it back to the same file
by hotshot (Prior) on Aug 27, 2002 at 07:57 UTC
    you can always read the file to an array, work on the array (change the necessary line), and print back the array to the file.

    Hotshot